Почему в не срабатывает метод __callStatic? Код (PHP): <span class="syntaxdefault"></span><span class="syntaxkeyword"><?</span><span class="syntaxdefault">php<br /><br />class DB </span><span class="syntaxkeyword">{<br /></span><span class="syntaxdefault"> private static $_instance</span><span class="syntaxkeyword">;<br /></span><span class="syntaxdefault"> private static $_pdo</span><span class="syntaxkeyword">;<br /></span><span class="syntaxdefault"> private static $_statement </span><span class="syntaxkeyword">=</span><span class="syntaxdefault"> null</span><span class="syntaxkeyword">;<br /></span><span class="syntaxdefault"> <br /> public function __construct</span><span class="syntaxkeyword">()</span><span class="syntaxdefault"> </span><span class="syntaxkeyword">{<br /></span><span class="syntaxdefault"> $db_host </span><span class="syntaxkeyword">=</span><span class="syntaxdefault"> Config</span><span class="syntaxkeyword">::</span><span class="syntaxdefault">get</span><span class="syntaxkeyword">(</span><span class="syntaxstring">'database.host'</span><span class="syntaxkeyword">);<br /></span><span class="syntaxdefault"> $db_name </span><span class="syntaxkeyword">=</span><span class="syntaxdefault"> Config</span><span class="syntaxkeyword">::</span><span class="syntaxdefault">get</span><span class="syntaxkeyword">(</span><span class="syntaxstring">'database.name'</span><span class="syntaxkeyword">);<br /></span><span class="syntaxdefault"> $db_user </span><span class="syntaxkeyword">=</span><span class="syntaxdefault"> Config</span><span class="syntaxkeyword">::</span><span class="syntaxdefault">get</span><span class="syntaxkeyword">(</span><span class="syntaxstring">'database.user'</span><span class="syntaxkeyword">);<br /></span><span class="syntaxdefault"> $db_pass </span><span class="syntaxkeyword">=</span><span class="syntaxdefault"> Config</span><span class="syntaxkeyword">::</span><span class="syntaxdefault">get</span><span class="syntaxkeyword">(</span><span class="syntaxstring">'database.pass'</span><span class="syntaxkeyword">);<br /></span><span class="syntaxdefault"> <br /> try </span><span class="syntaxkeyword">{<br /></span><span class="syntaxdefault"> self</span><span class="syntaxkeyword">::</span><span class="syntaxdefault">$_pdo </span><span class="syntaxkeyword">=</span><span class="syntaxdefault"> new PDO</span><span class="syntaxkeyword">(</span><span class="syntaxstring">'mysql:host='</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">$db_host</span><span class="syntaxkeyword">.</span><span class="syntaxstring">';dbname='</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">$db_name</span><span class="syntaxkeyword">,</span><span class="syntaxdefault"> $db_user</span><span class="syntaxkeyword">,</span><span class="syntaxdefault"> $db_pass</span><span class="syntaxkeyword">);<br /></span><span class="syntaxdefault"> self</span><span class="syntaxkeyword">::</span><span class="syntaxdefault">$_pdo</span><span class="syntaxkeyword">-></span><span class="syntaxdefault">setAttribute</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">PDO</span><span class="syntaxkeyword">::</span><span class="syntaxdefault">ATTR_DEFAULT_FETCH_MODE</span><span class="syntaxkeyword">,</span><span class="syntaxdefault"> PDO</span><span class="syntaxkeyword">::</span><span class="syntaxdefault">FETCH_OBJ</span><span class="syntaxkeyword">);<br /></span><span class="syntaxdefault"> self</span><span class="syntaxkeyword">::</span><span class="syntaxdefault">$_pdo</span><span class="syntaxkeyword">-></span><span class="syntaxdefault">query</span><span class="syntaxkeyword">(</span><span class="syntaxstring">'SET NAMES `utf8` COLLATE `utf8_unicode_ci`'</span><span class="syntaxkeyword">);<br /></span><span class="syntaxdefault"> </span><span class="syntaxkeyword">}</span><span class="syntaxdefault"> catch </span><span class="syntaxkeyword">(</span><span class="syntaxdefault">PDOException $e</span><span class="syntaxkeyword">)</span><span class="syntaxdefault"> </span><span class="syntaxkeyword">{}<br /></span><span class="syntaxdefault"> </span><span class="syntaxkeyword">}<br /></span><span class="syntaxdefault"> <br /> public function __clone</span><span class="syntaxkeyword">()</span><span class="syntaxdefault"> </span><span class="syntaxkeyword">{}<br /></span><span class="syntaxdefault"> <br /> public static function __callStatic</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">$method</span><span class="syntaxkeyword">,</span><span class="syntaxdefault"> $arguments</span><span class="syntaxkeyword">)</span><span class="syntaxdefault"> </span><span class="syntaxkeyword">{<br /></span><span class="syntaxdefault"> if </span><span class="syntaxkeyword">(!</span><span class="syntaxdefault">self</span><span class="syntaxkeyword">::</span><span class="syntaxdefault">$_instance</span><span class="syntaxkeyword">)</span><span class="syntaxdefault"> self</span><span class="syntaxkeyword">::</span><span class="syntaxdefault">$_instance </span><span class="syntaxkeyword">=</span><span class="syntaxdefault"> new DB</span><span class="syntaxkeyword">;<br /></span><span class="syntaxdefault"> call_user_func_array</span><span class="syntaxkeyword">(array(</span><span class="syntaxdefault">self</span><span class="syntaxkeyword">::</span><span class="syntaxdefault">$_instance</span><span class="syntaxkeyword">,</span><span class="syntaxdefault"> $method</span><span class="syntaxkeyword">),</span><span class="syntaxdefault"> $arguments</span><span class="syntaxkeyword">);<br /></span><span class="syntaxdefault"> </span><span class="syntaxkeyword">}<br /></span><span class="syntaxdefault"> <br /> public static function quote</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">$str</span><span class="syntaxkeyword">)</span><span class="syntaxdefault"> </span><span class="syntaxkeyword">{<br /></span><span class="syntaxdefault"> return self</span><span class="syntaxkeyword">::</span><span class="syntaxdefault">$_pdo</span><span class="syntaxkeyword">-></span><span class="syntaxdefault">quote</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">$str</span><span class="syntaxkeyword">);<br /></span><span class="syntaxdefault"> </span><span class="syntaxkeyword">}<br /></span><span class="syntaxdefault"> <br /> public static function bindParams</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">$query</span><span class="syntaxkeyword">,</span><span class="syntaxdefault"> $params </span><span class="syntaxkeyword">=</span><span class="syntaxdefault"> array</span><span class="syntaxkeyword">())</span><span class="syntaxdefault"> </span><span class="syntaxkeyword">{<br /></span><span class="syntaxdefault"> if </span><span class="syntaxkeyword">(</span><span class="syntaxdefault">is_array</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">$params</span><span class="syntaxkeyword">)</span><span class="syntaxdefault"> </span><span class="syntaxkeyword">&&</span><span class="syntaxdefault"> $count </span><span class="syntaxkeyword">=</span><span class="syntaxdefault"> count</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">$params</span><span class="syntaxkeyword">))</span><span class="syntaxdefault"> </span><span class="syntaxkeyword">{<br /></span><span class="syntaxdefault"> for </span><span class="syntaxkeyword">(</span><span class="syntaxdefault">$i </span><span class="syntaxkeyword">=</span><span class="syntaxdefault"> 0</span><span class="syntaxkeyword">;</span><span class="syntaxdefault"> $i </span><span class="syntaxkeyword"><</span><span class="syntaxdefault"> $count</span><span class="syntaxkeyword">;</span><span class="syntaxdefault"> </span><span class="syntaxkeyword">++</span><span class="syntaxdefault">$i</span><span class="syntaxkeyword">)</span><span class="syntaxdefault"> </span><span class="syntaxkeyword">{<br /></span><span class="syntaxdefault"> $pos </span><span class="syntaxkeyword">=</span><span class="syntaxdefault"> strpos</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">$query</span><span class="syntaxkeyword">,</span><span class="syntaxdefault"> </span><span class="syntaxstring">'?'</span><span class="syntaxkeyword">);<br /></span><span class="syntaxdefault"> $param </span><span class="syntaxkeyword">=</span><span class="syntaxdefault"> self</span><span class="syntaxkeyword">::</span><span class="syntaxdefault">quote</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">$params</span><span class="syntaxkeyword">[</span><span class="syntaxdefault">$i</span><span class="syntaxkeyword">]);<br /></span><span class="syntaxdefault"> $query </span><span class="syntaxkeyword">=</span><span class="syntaxdefault"> substr_replace</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">$query</span><span class="syntaxkeyword">,</span><span class="syntaxdefault"> $param</span><span class="syntaxkeyword">,</span><span class="syntaxdefault"> $pos</span><span class="syntaxkeyword">,</span><span class="syntaxdefault"> 1</span><span class="syntaxkeyword">);<br /></span><span class="syntaxdefault"> </span><span class="syntaxkeyword">}<br /></span><span class="syntaxdefault"> </span><span class="syntaxkeyword">}<br /></span><span class="syntaxdefault"> return $query</span><span class="syntaxkeyword">;<br /></span><span class="syntaxdefault"> </span><span class="syntaxkeyword">}<br /></span><span class="syntaxdefault"> <br /> public static function query</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">$query</span><span class="syntaxkeyword">)</span><span class="syntaxdefault"> </span><span class="syntaxkeyword">{<br /></span><span class="syntaxdefault"> return self</span><span class="syntaxkeyword">::</span><span class="syntaxdefault">$_pdo</span><span class="syntaxkeyword">-></span><span class="syntaxdefault">query</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">$query</span><span class="syntaxkeyword">);<br /></span><span class="syntaxdefault"> </span><span class="syntaxkeyword">}<br /></span><span class="syntaxdefault"> <br /> public static function select</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">$query</span><span class="syntaxkeyword">,</span><span class="syntaxdefault"> $params </span><span class="syntaxkeyword">=</span><span class="syntaxdefault"> array</span><span class="syntaxkeyword">())</span><span class="syntaxdefault"> </span><span class="syntaxkeyword">{<br /></span><span class="syntaxdefault"> self</span><span class="syntaxkeyword">::</span><span class="syntaxdefault">$_statement </span><span class="syntaxkeyword">=</span><span class="syntaxdefault"> self</span><span class="syntaxkeyword">::</span><span class="syntaxdefault">bindParams</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">$query</span><span class="syntaxkeyword">,</span><span class="syntaxdefault"> $params</span><span class="syntaxkeyword">);<br /></span><span class="syntaxdefault"> return self</span><span class="syntaxkeyword">::</span><span class="syntaxdefault">$_instance</span><span class="syntaxkeyword">;<br /></span><span class="syntaxdefault"> </span><span class="syntaxkeyword">}<br /></span><span class="syntaxdefault"> <br /> public function get</span><span class="syntaxkeyword">()</span><span class="syntaxdefault"> </span><span class="syntaxkeyword">{<br /></span><span class="syntaxdefault"> return self</span><span class="syntaxkeyword">::</span><span class="syntaxdefault">query</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">self</span><span class="syntaxkeyword">::</span><span class="syntaxdefault">$_statement</span><span class="syntaxkeyword">)-></span><span class="syntaxdefault">fetch</span><span class="syntaxkeyword">();<br /></span><span class="syntaxdefault"> </span><span class="syntaxkeyword">}<br />}</span><span class="syntaxdefault"></span>
Он сработает только при вызове несуществующего статического метода. И что-то непонятное внутри нарисовано
ПРо Если метод статический, ему не нужен экземпляр Добавлено спустя 1 минуту 27 секунд: Синглтоны не так делаются. Закрывается конструктор, и делается статический метод типа instance(), который создаёт (если ещё не создано) и возвращает экземпляр класса. А все остальные методы делаются обычными - не статическими. Статические функции - это такие, которым не нужен экземпляр класса для работы, грубо говоря.
Я хочу сделать вроде этого: Код (PHP): <span class="syntaxdefault">$user </span><span class="syntaxkeyword">=</span><span class="syntaxdefault"> DB</span><span class="syntaxkeyword">::</span><span class="syntaxdefault">select</span><span class="syntaxkeyword">(</span><span class="syntaxstring">'SELECT * FROM `users` WHERE `id` = ? LIMIT 1'</span><span class="syntaxkeyword">,</span><span class="syntaxdefault"> array</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">1</span><span class="syntaxkeyword">))-></span><span class="syntaxdefault">get</span><span class="syntaxkeyword">();<br /></span><span class="syntaxdefault">$user </span><span class="syntaxkeyword">=</span><span class="syntaxdefault"> DB</span><span class="syntaxkeyword">::</span><span class="syntaxdefault">table</span><span class="syntaxkeyword">(</span><span class="syntaxstring">'users'</span><span class="syntaxkeyword">)-></span><span class="syntaxdefault">where</span><span class="syntaxkeyword">(array(</span><span class="syntaxstring">'id'</span><span class="syntaxdefault"> </span><span class="syntaxkeyword">=></span><span class="syntaxdefault"> 1</span><span class="syntaxkeyword">))-></span><span class="syntaxdefault">get</span><span class="syntaxkeyword">();</span><span class="syntaxdefault"></span> Ну и так далее) Вот доработал немного: Код (PHP): <span class="syntaxdefault"></span><span class="syntaxkeyword"><?</span><span class="syntaxdefault">php<br /><br /></span><span class="syntaxkeyword">class </span><span class="syntaxdefault">DB </span><span class="syntaxkeyword">{<br /> private static </span><span class="syntaxdefault">$_instance</span><span class="syntaxkeyword">;<br /> private static </span><span class="syntaxdefault">$_pdo</span><span class="syntaxkeyword">;<br /> private static </span><span class="syntaxdefault">$_statement </span><span class="syntaxkeyword">= </span><span class="syntaxdefault">null</span><span class="syntaxkeyword">;<br /> <br /> private static </span><span class="syntaxdefault">$where_count </span><span class="syntaxkeyword">= </span><span class="syntaxdefault">0</span><span class="syntaxkeyword">;<br /> <br /> public function </span><span class="syntaxdefault">__construct</span><span class="syntaxkeyword">() {<br /> </span><span class="syntaxdefault">$db_host </span><span class="syntaxkeyword">= </span><span class="syntaxdefault">Config</span><span class="syntaxkeyword">::</span><span class="syntaxdefault">get</span><span class="syntaxkeyword">(</span><span class="syntaxstring">'database.host'</span><span class="syntaxkeyword">);<br /> </span><span class="syntaxdefault">$db_name </span><span class="syntaxkeyword">= </span><span class="syntaxdefault">Config</span><span class="syntaxkeyword">::</span><span class="syntaxdefault">get</span><span class="syntaxkeyword">(</span><span class="syntaxstring">'database.name'</span><span class="syntaxkeyword">);<br /> </span><span class="syntaxdefault">$db_user </span><span class="syntaxkeyword">= </span><span class="syntaxdefault">Config</span><span class="syntaxkeyword">::</span><span class="syntaxdefault">get</span><span class="syntaxkeyword">(</span><span class="syntaxstring">'database.user'</span><span class="syntaxkeyword">);<br /> </span><span class="syntaxdefault">$db_pass </span><span class="syntaxkeyword">= </span><span class="syntaxdefault">Config</span><span class="syntaxkeyword">::</span><span class="syntaxdefault">get</span><span class="syntaxkeyword">(</span><span class="syntaxstring">'database.pass'</span><span class="syntaxkeyword">);<br /> <br /> try {<br /> </span><span class="syntaxdefault">self</span><span class="syntaxkeyword">::</span><span class="syntaxdefault">$_pdo </span><span class="syntaxkeyword">= new </span><span class="syntaxdefault">PDO</span><span class="syntaxkeyword">(</span><span class="syntaxstring">'mysql:host='</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">$db_host</span><span class="syntaxkeyword">.</span><span class="syntaxstring">';dbname='</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">$db_name</span><span class="syntaxkeyword">, </span><span class="syntaxdefault">$db_user</span><span class="syntaxkeyword">, </span><span class="syntaxdefault">$db_pass</span><span class="syntaxkeyword">);<br /> </span><span class="syntaxdefault">self</span><span class="syntaxkeyword">::</span><span class="syntaxdefault">$_pdo</span><span class="syntaxkeyword">-></span><span class="syntaxdefault">setAttribute</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">PDO</span><span class="syntaxkeyword">::</span><span class="syntaxdefault">ATTR_DEFAULT_FETCH_MODE</span><span class="syntaxkeyword">, </span><span class="syntaxdefault">PDO</span><span class="syntaxkeyword">::</span><span class="syntaxdefault">FETCH_OBJ</span><span class="syntaxkeyword">);<br /> </span><span class="syntaxdefault">self</span><span class="syntaxkeyword">::</span><span class="syntaxdefault">$_pdo</span><span class="syntaxkeyword">-></span><span class="syntaxdefault">query</span><span class="syntaxkeyword">(</span><span class="syntaxstring">'SET NAMES `utf8` COLLATE `utf8_unicode_ci`'</span><span class="syntaxkeyword">);<br /> } catch (</span><span class="syntaxdefault">PDOException $e</span><span class="syntaxkeyword">) {}<br /> }<br /> <br /> public function </span><span class="syntaxdefault">__clone</span><span class="syntaxkeyword">() {}<br /> <br /> public static function </span><span class="syntaxdefault">quote</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">$str</span><span class="syntaxkeyword">) {<br /> if (!</span><span class="syntaxdefault">self</span><span class="syntaxkeyword">::</span><span class="syntaxdefault">$_instance</span><span class="syntaxkeyword">) </span><span class="syntaxdefault">self</span><span class="syntaxkeyword">::</span><span class="syntaxdefault">$_instance </span><span class="syntaxkeyword">= new </span><span class="syntaxdefault">DB</span><span class="syntaxkeyword">;<br /> return </span><span class="syntaxdefault">self</span><span class="syntaxkeyword">::</span><span class="syntaxdefault">$_pdo</span><span class="syntaxkeyword">-></span><span class="syntaxdefault">quote</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">$str</span><span class="syntaxkeyword">);<br /> }<br /> <br /> public static function </span><span class="syntaxdefault">bindParams</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">$query</span><span class="syntaxkeyword">, </span><span class="syntaxdefault">$params </span><span class="syntaxkeyword">= array()) {<br /> if (!</span><span class="syntaxdefault">self</span><span class="syntaxkeyword">::</span><span class="syntaxdefault">$_instance</span><span class="syntaxkeyword">) </span><span class="syntaxdefault">self</span><span class="syntaxkeyword">::</span><span class="syntaxdefault">$_instance </span><span class="syntaxkeyword">= new </span><span class="syntaxdefault">DB</span><span class="syntaxkeyword">;<br /> if (</span><span class="syntaxdefault">is_array</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">$params</span><span class="syntaxkeyword">) && </span><span class="syntaxdefault">$count </span><span class="syntaxkeyword">= </span><span class="syntaxdefault">count</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">$params</span><span class="syntaxkeyword">)) {<br /> for (</span><span class="syntaxdefault">$i </span><span class="syntaxkeyword">= </span><span class="syntaxdefault">0</span><span class="syntaxkeyword">; </span><span class="syntaxdefault">$i </span><span class="syntaxkeyword">< </span><span class="syntaxdefault">$count</span><span class="syntaxkeyword">; ++</span><span class="syntaxdefault">$i</span><span class="syntaxkeyword">) {<br /> </span><span class="syntaxdefault">$pos </span><span class="syntaxkeyword">= </span><span class="syntaxdefault">strpos</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">$query</span><span class="syntaxkeyword">, </span><span class="syntaxstring">'?'</span><span class="syntaxkeyword">);<br /> </span><span class="syntaxdefault">$param </span><span class="syntaxkeyword">= </span><span class="syntaxdefault">self</span><span class="syntaxkeyword">::</span><span class="syntaxdefault">quote</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">$params</span><span class="syntaxkeyword">[</span><span class="syntaxdefault">$i</span><span class="syntaxkeyword">]);<br /> </span><span class="syntaxdefault">$query </span><span class="syntaxkeyword">= </span><span class="syntaxdefault">substr_replace</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">$query</span><span class="syntaxkeyword">, </span><span class="syntaxdefault">$param</span><span class="syntaxkeyword">, </span><span class="syntaxdefault">$pos</span><span class="syntaxkeyword">, </span><span class="syntaxdefault">1</span><span class="syntaxkeyword">);<br /> }<br /> }<br /> return </span><span class="syntaxdefault">$query</span><span class="syntaxkeyword">;<br /> }<br /> <br /> public static function </span><span class="syntaxdefault">query</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">$query</span><span class="syntaxkeyword">) {<br /> if (!</span><span class="syntaxdefault">self</span><span class="syntaxkeyword">::</span><span class="syntaxdefault">$_instance</span><span class="syntaxkeyword">) </span><span class="syntaxdefault">self</span><span class="syntaxkeyword">::</span><span class="syntaxdefault">$_instance </span><span class="syntaxkeyword">= new </span><span class="syntaxdefault">DB</span><span class="syntaxkeyword">;<br /> return </span><span class="syntaxdefault">self</span><span class="syntaxkeyword">::</span><span class="syntaxdefault">$_pdo</span><span class="syntaxkeyword">-></span><span class="syntaxdefault">query</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">$query</span><span class="syntaxkeyword">);<br /> }<br /> <br /> public static function </span><span class="syntaxdefault">select</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">$query</span><span class="syntaxkeyword">, </span><span class="syntaxdefault">$params </span><span class="syntaxkeyword">= array()) {<br /> if (!</span><span class="syntaxdefault">self</span><span class="syntaxkeyword">::</span><span class="syntaxdefault">$_instance</span><span class="syntaxkeyword">) </span><span class="syntaxdefault">self</span><span class="syntaxkeyword">::</span><span class="syntaxdefault">$_instance </span><span class="syntaxkeyword">= new </span><span class="syntaxdefault">DB</span><span class="syntaxkeyword">;<br /> </span><span class="syntaxdefault">self</span><span class="syntaxkeyword">::</span><span class="syntaxdefault">$_statement </span><span class="syntaxkeyword">= </span><span class="syntaxdefault">self</span><span class="syntaxkeyword">::</span><span class="syntaxdefault">bindParams</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">$query</span><span class="syntaxkeyword">, </span><span class="syntaxdefault">$params</span><span class="syntaxkeyword">);<br /> return </span><span class="syntaxdefault">self</span><span class="syntaxkeyword">::</span><span class="syntaxdefault">$_instance</span><span class="syntaxkeyword">;<br /> }<br /> <br /> public static function </span><span class="syntaxdefault">table</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">$table</span><span class="syntaxkeyword">) {<br /> if (!</span><span class="syntaxdefault">self</span><span class="syntaxkeyword">::</span><span class="syntaxdefault">$_instance</span><span class="syntaxkeyword">) </span><span class="syntaxdefault">self</span><span class="syntaxkeyword">::</span><span class="syntaxdefault">$_instance </span><span class="syntaxkeyword">= new </span><span class="syntaxdefault">DB</span><span class="syntaxkeyword">;<br /> </span><span class="syntaxdefault">self</span><span class="syntaxkeyword">::</span><span class="syntaxdefault">$_statement </span><span class="syntaxkeyword">= </span><span class="syntaxstring">'SELECT * FROM `'</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">$table</span><span class="syntaxkeyword">.</span><span class="syntaxstring">'`'</span><span class="syntaxkeyword">;<br /> return </span><span class="syntaxdefault">self</span><span class="syntaxkeyword">::</span><span class="syntaxdefault">$_instance</span><span class="syntaxkeyword">;<br /> }<br /> <br /> public function </span><span class="syntaxdefault">where</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">$params </span><span class="syntaxkeyword">= array()) {<br /> if (</span><span class="syntaxdefault">self</span><span class="syntaxkeyword">::</span><span class="syntaxdefault">$where_count </span><span class="syntaxkeyword">== </span><span class="syntaxdefault">0</span><span class="syntaxkeyword">) </span><span class="syntaxdefault">self</span><span class="syntaxkeyword">::</span><span class="syntaxdefault">$_statement </span><span class="syntaxkeyword">.= </span><span class="syntaxstring">' WHERE '</span><span class="syntaxkeyword">;<br /> foreach (</span><span class="syntaxdefault">$params </span><span class="syntaxkeyword">as </span><span class="syntaxdefault">$name </span><span class="syntaxkeyword">=> </span><span class="syntaxdefault">$value</span><span class="syntaxkeyword">) {<br /> </span><span class="syntaxdefault">self</span><span class="syntaxkeyword">::</span><span class="syntaxdefault">$_statement </span><span class="syntaxkeyword">.= (</span><span class="syntaxdefault">self</span><span class="syntaxkeyword">::</span><span class="syntaxdefault">$where_count </span><span class="syntaxkeyword">> </span><span class="syntaxdefault">0 </span><span class="syntaxkeyword">? </span><span class="syntaxstring">' AND ' </span><span class="syntaxkeyword">: </span><span class="syntaxdefault">null</span><span class="syntaxkeyword">).</span><span class="syntaxstring">'`'</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">$name</span><span class="syntaxkeyword">.</span><span class="syntaxstring">'` = '</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">self</span><span class="syntaxkeyword">::</span><span class="syntaxdefault">quote</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">$value</span><span class="syntaxkeyword">);<br /> </span><span class="syntaxdefault">self</span><span class="syntaxkeyword">::</span><span class="syntaxdefault">$where_count</span><span class="syntaxkeyword">++; }<br /> return </span><span class="syntaxdefault">self</span><span class="syntaxkeyword">::</span><span class="syntaxdefault">$_instance</span><span class="syntaxkeyword">;<br /> }<br /> <br /> public function </span><span class="syntaxdefault">get</span><span class="syntaxkeyword">() {<br /> return </span><span class="syntaxdefault">self</span><span class="syntaxkeyword">::</span><span class="syntaxdefault">query</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">self</span><span class="syntaxkeyword">::</span><span class="syntaxdefault">$_statement</span><span class="syntaxkeyword">)-></span><span class="syntaxdefault">fetch</span><span class="syntaxkeyword">();<br /> }<br />} </span><span class="syntaxdefault"></span>
Это порнография, поскольку кода дублируется дофига. Зачем вам статические методы? А если статические, зачем создавать экземпляр? Сделали бы статический экземпляр PDO и статическую функцию по его созданию. Но я считаю, что лучше нормальный экземпляр класса сделать. Вот синглтон базы данных схематично: Код (PHP): class DB { private $pdo; static private $inst = null; private function __construct() { $this->pdo = new PDO(/* параметры */); } static public function instance() { if (self::$instance === null) self::$instance = new self(); return self::$instance; } public function query() { } /* И всё остальное */ } $db = DB::instance(); $db->query("drop table users");
А зачем тогда классы, если не создавать экземпляры? Ну фиг с вами. Тогда не нужно делать конструктор и создавать экземпляр - а то вы ничего не выигрываете вообще от своих статических методов (обычно так пишут те, кому жалко пару долей миллисекунды на создание экземпляра класса. Ну ещё аргумент - типа экземпляр много памяти занимает, тоже мне не очень верится) Кому проще? И что проверять в каждом методе? Что-то такое имеете в виду? Код (Text): class DB { static private $pdo = null; static private funciton init() { if (self::$pdo === null) self::$pdo = new PDO(/* параметры */); } static public function query($q) { self::init(); return self::$pdo->query($q); } } А смысл в таком классе?
Да. Думаешь это такие жестокие накладные расходы? Спорить не хочу =) мысль высказал. Кому привычно сначала делать ссылку на экземпляр - его дело.
ОК, не будем спорить. Я и создание объекта не считаю огромными накладными расходами. ТС, если хотите класс БД полностью на статических методах, возьмите мой последний пример за основу - чтоб не дублировать код создания объекта PDO в каждом классе - не красиво, и не создавать не нужный вам экземпляр класса.
объект-то единожды создаётся. Тут вопрос в том, что если ты строго через метод получаешь на него ссылку, то это удобно там, где методы стоит вызывать из объекта напрямую. В случае, если у тебя методы синглтона заранее известны и ограничены, и ты проверку и создание пихаешь в каждый метод, то объект тоже создаётся только один раз, но можно сразу дёргать какие-то методы синглтона, а если надо обратиться к объекту напрямую, то можно только тогда заюзать метод со ссылкой. Экономия. =)
ТС явно хочет сделать синглтон. по сути, синглтон - обычный класс, нестатический. но - конструктор заблокирован, клонирование заблокировано. экземпляр класса получаем через всего один статический метод. если ТСу хочется краткости, то можно сделать короткую функцию(внутри тот же синглтон получать) алиас, и обращаться к БД так: db()->select(...); сразу, из любого места.
Это очень странная формулировка. Синглтон это класс, которы либо сам, либо оборачивает экземпляр некоего класса, который существует в единственном экземпляре. В вики так же написано "с глобальной точкой доступа". Мне кажется, что раз он в одном экземпляре, то статиковая оболочка лучше всего решает этот вопрос. Эстественно, что если это "экземпляр", то это заведомо не статическая штука. Но статика формирует как раз интерфейс. В PHP статика бесплатно глобальна.
Отличие синглтона от статики в том, что синглтон предоставляет контекстно зависимый интерфейс. Статика же контекстно независима (должна быть, по крайней мере). Если нужно сделать некую сущность, которая должна работать в единственном экземпляре, контроллить свое состояние и общаться с внешним миром посредством пачки внешних методов, то вам нужен синглтон. Если нужно сделать эдакую библиотеку функций, связанных единой целью, которые было бы можно дергать направо и налево, вам нужна статика. Для БД обертки, имхо, юзайте статику.
ничего странного. в той же вики приведен пример кода на пхп. реализующий синглтон. посмотри. Это обычный класс. Из статики там только переменная - хранящая ЭКЗЕМПЛЯР класса и метод getInstance через который этот экземпляр можно получить. всё! все остальные свойства и методы нестатические и реализованы для их использования в контексте созданного объекта. никакая "статиковаЯ" оболочка не требуется. класс сам реализует соответсвующий метод.
Но это не аксиома. Я ж говорю, автоинит на мой взгляд удобнее в случае с заранее известными методами. Неужели никогда не замечали ленивую инициализацию?
ну вот в getInstance и будет инициализация объекта. при первом же обращении. тоесть тогда когда уже нужны данные. или ты про боле ленивую?) тогда поясни
Ну ты проверку и вызов создания пихаешь в каждый метод как тут viewtopic.php?p=397218#p397218 и можешь без получения ссылки на объект сразу юзать методы статик-обёртки. Экономится целая строка!
но в методе init() то у тебя все равно есть рождение объекта? так? а раз ВСЕ РАВНО объект создается, в чем профит от статики в данном случае? никакого. наоборот. весь класс пронизан копипастом. в каждом методе вызов init(). и главное зачем? когда можно сделать классическую конструкцию(синглтон). которая будет проще в реализации и делать точно тоже самое по затратам на создание объекта. какая строка экономится? всё делается и так одной строкой. $rows = Db::getInstance()->getRows(); переубеждать не буду. аргументы все приведены. дело хозяйское
Ну слово одно. Не вижу смысла печатать каждый раз одно и то же, если можно на автомате. Чего ты так боишься?
экономия должна быть экономной. но всегда есть предел. так рассуждая можно дойти до еще более короткого варианта: $data = getRows(...); а там внутри пусть всё втысячный раз описать, и проверки и инициализацию объекта... вот этого я и боюсь. что в итоге преждевременная оптимизация - приведет к обратному эффекту. и от нее появляется реальный вред.