За последние 24 часа нас посетил 32761 программист и 1820 роботов. Сейчас ищут 863 программиста ...

Не срабатывает метод __callStatic

Тема в разделе "PHP для новичков", создана пользователем abler98, 22 сен 2014.

  1. abler98

    abler98 Активный пользователь

    С нами с:
    31 авг 2014
    Сообщения:
    43
    Симпатии:
    0
    Почему в не срабатывает метод __callStatic?
    Код (PHP):
    1. <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>
     
  2. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    Он сработает только при вызове несуществующего статического метода. И что-то непонятное внутри нарисовано
     
  3. abler98

    abler98 Активный пользователь

    С нами с:
    31 авг 2014
    Сообщения:
    43
    Симпатии:
    0
    Значит нужно вручную везде вписывать?
    Это Вы про что?
     
  4. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    ПРо
    Если метод статический, ему не нужен экземпляр

    Добавлено спустя 1 минуту 27 секунд:
    Синглтоны не так делаются. Закрывается конструктор, и делается статический метод типа instance(), который создаёт (если ещё не создано) и возвращает экземпляр класса. А все остальные методы делаются обычными - не статическими. Статические функции - это такие, которым не нужен экземпляр класса для работы, грубо говоря.
     
  5. abler98

    abler98 Активный пользователь

    С нами с:
    31 авг 2014
    Сообщения:
    43
    Симпатии:
    0
    Я хочу сделать вроде этого:
    Код (PHP):
    1. <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):
    1. <span class="syntaxdefault"></span><span class="syntaxkeyword"><?</span><span class="syntaxdefault">php<br /><br /></span><span class="syntaxkeyword">class&nbsp;</span><span class="syntaxdefault">DB&nbsp;</span><span class="syntaxkeyword">{<br />&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;static&nbsp;</span><span class="syntaxdefault">$_instance</span><span class="syntaxkeyword">;<br />&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;static&nbsp;</span><span class="syntaxdefault">$_pdo</span><span class="syntaxkeyword">;<br />&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;static&nbsp;</span><span class="syntaxdefault">$_statement&nbsp;</span><span class="syntaxkeyword">=&nbsp;</span><span class="syntaxdefault">null</span><span class="syntaxkeyword">;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;static&nbsp;</span><span class="syntaxdefault">$where_count&nbsp;</span><span class="syntaxkeyword">=&nbsp;</span><span class="syntaxdefault">0</span><span class="syntaxkeyword">;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;function&nbsp;</span><span class="syntaxdefault">__construct</span><span class="syntaxkeyword">()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxdefault">$db_host&nbsp;</span><span class="syntaxkeyword">=&nbsp;</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 />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxdefault">$db_name&nbsp;</span><span class="syntaxkeyword">=&nbsp;</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 />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxdefault">$db_user&nbsp;</span><span class="syntaxkeyword">=&nbsp;</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 />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxdefault">$db_pass&nbsp;</span><span class="syntaxkeyword">=&nbsp;</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 />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxdefault">self</span><span class="syntaxkeyword">::</span><span class="syntaxdefault">$_pdo&nbsp;</span><span class="syntaxkeyword">=&nbsp;new&nbsp;</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">,&nbsp;</span><span class="syntaxdefault">$db_user</span><span class="syntaxkeyword">,&nbsp;</span><span class="syntaxdefault">$db_pass</span><span class="syntaxkeyword">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</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">,&nbsp;</span><span class="syntaxdefault">PDO</span><span class="syntaxkeyword">::</span><span class="syntaxdefault">FETCH_OBJ</span><span class="syntaxkeyword">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</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&nbsp;NAMES&nbsp;`utf8`&nbsp;COLLATE&nbsp;`utf8_unicode_ci`'</span><span class="syntaxkeyword">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;catch&nbsp;(</span><span class="syntaxdefault">PDOException&nbsp;$e</span><span class="syntaxkeyword">)&nbsp;{}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;function&nbsp;</span><span class="syntaxdefault">__clone</span><span class="syntaxkeyword">()&nbsp;{}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;function&nbsp;</span><span class="syntaxdefault">quote</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">$str</span><span class="syntaxkeyword">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(!</span><span class="syntaxdefault">self</span><span class="syntaxkeyword">::</span><span class="syntaxdefault">$_instance</span><span class="syntaxkeyword">)&nbsp;</span><span class="syntaxdefault">self</span><span class="syntaxkeyword">::</span><span class="syntaxdefault">$_instance&nbsp;</span><span class="syntaxkeyword">=&nbsp;new&nbsp;</span><span class="syntaxdefault">DB</span><span class="syntaxkeyword">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;</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 />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;function&nbsp;</span><span class="syntaxdefault">bindParams</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">$query</span><span class="syntaxkeyword">,&nbsp;</span><span class="syntaxdefault">$params&nbsp;</span><span class="syntaxkeyword">=&nbsp;array())&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(!</span><span class="syntaxdefault">self</span><span class="syntaxkeyword">::</span><span class="syntaxdefault">$_instance</span><span class="syntaxkeyword">)&nbsp;</span><span class="syntaxdefault">self</span><span class="syntaxkeyword">::</span><span class="syntaxdefault">$_instance&nbsp;</span><span class="syntaxkeyword">=&nbsp;new&nbsp;</span><span class="syntaxdefault">DB</span><span class="syntaxkeyword">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(</span><span class="syntaxdefault">is_array</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">$params</span><span class="syntaxkeyword">)&nbsp;&&&nbsp;</span><span class="syntaxdefault">$count&nbsp;</span><span class="syntaxkeyword">=&nbsp;</span><span class="syntaxdefault">count</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">$params</span><span class="syntaxkeyword">))&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(</span><span class="syntaxdefault">$i&nbsp;</span><span class="syntaxkeyword">=&nbsp;</span><span class="syntaxdefault">0</span><span class="syntaxkeyword">;&nbsp;</span><span class="syntaxdefault">$i&nbsp;</span><span class="syntaxkeyword"><&nbsp;</span><span class="syntaxdefault">$count</span><span class="syntaxkeyword">;&nbsp;++</span><span class="syntaxdefault">$i</span><span class="syntaxkeyword">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxdefault">$pos&nbsp;</span><span class="syntaxkeyword">=&nbsp;</span><span class="syntaxdefault">strpos</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">$query</span><span class="syntaxkeyword">,&nbsp;</span><span class="syntaxstring">'?'</span><span class="syntaxkeyword">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxdefault">$param&nbsp;</span><span class="syntaxkeyword">=&nbsp;</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 />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxdefault">$query&nbsp;</span><span class="syntaxkeyword">=&nbsp;</span><span class="syntaxdefault">substr_replace</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">$query</span><span class="syntaxkeyword">,&nbsp;</span><span class="syntaxdefault">$param</span><span class="syntaxkeyword">,&nbsp;</span><span class="syntaxdefault">$pos</span><span class="syntaxkeyword">,&nbsp;</span><span class="syntaxdefault">1</span><span class="syntaxkeyword">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;</span><span class="syntaxdefault">$query</span><span class="syntaxkeyword">;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;function&nbsp;</span><span class="syntaxdefault">query</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">$query</span><span class="syntaxkeyword">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(!</span><span class="syntaxdefault">self</span><span class="syntaxkeyword">::</span><span class="syntaxdefault">$_instance</span><span class="syntaxkeyword">)&nbsp;</span><span class="syntaxdefault">self</span><span class="syntaxkeyword">::</span><span class="syntaxdefault">$_instance&nbsp;</span><span class="syntaxkeyword">=&nbsp;new&nbsp;</span><span class="syntaxdefault">DB</span><span class="syntaxkeyword">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;</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 />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;function&nbsp;</span><span class="syntaxdefault">select</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">$query</span><span class="syntaxkeyword">,&nbsp;</span><span class="syntaxdefault">$params&nbsp;</span><span class="syntaxkeyword">=&nbsp;array())&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(!</span><span class="syntaxdefault">self</span><span class="syntaxkeyword">::</span><span class="syntaxdefault">$_instance</span><span class="syntaxkeyword">)&nbsp;</span><span class="syntaxdefault">self</span><span class="syntaxkeyword">::</span><span class="syntaxdefault">$_instance&nbsp;</span><span class="syntaxkeyword">=&nbsp;new&nbsp;</span><span class="syntaxdefault">DB</span><span class="syntaxkeyword">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxdefault">self</span><span class="syntaxkeyword">::</span><span class="syntaxdefault">$_statement&nbsp;</span><span class="syntaxkeyword">=&nbsp;</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">,&nbsp;</span><span class="syntaxdefault">$params</span><span class="syntaxkeyword">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;</span><span class="syntaxdefault">self</span><span class="syntaxkeyword">::</span><span class="syntaxdefault">$_instance</span><span class="syntaxkeyword">;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;function&nbsp;</span><span class="syntaxdefault">table</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">$table</span><span class="syntaxkeyword">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(!</span><span class="syntaxdefault">self</span><span class="syntaxkeyword">::</span><span class="syntaxdefault">$_instance</span><span class="syntaxkeyword">)&nbsp;</span><span class="syntaxdefault">self</span><span class="syntaxkeyword">::</span><span class="syntaxdefault">$_instance&nbsp;</span><span class="syntaxkeyword">=&nbsp;new&nbsp;</span><span class="syntaxdefault">DB</span><span class="syntaxkeyword">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxdefault">self</span><span class="syntaxkeyword">::</span><span class="syntaxdefault">$_statement&nbsp;</span><span class="syntaxkeyword">=&nbsp;</span><span class="syntaxstring">'SELECT&nbsp;*&nbsp;FROM&nbsp;`'</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">$table</span><span class="syntaxkeyword">.</span><span class="syntaxstring">'`'</span><span class="syntaxkeyword">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;</span><span class="syntaxdefault">self</span><span class="syntaxkeyword">::</span><span class="syntaxdefault">$_instance</span><span class="syntaxkeyword">;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;function&nbsp;</span><span class="syntaxdefault">where</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">$params&nbsp;</span><span class="syntaxkeyword">=&nbsp;array())&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(</span><span class="syntaxdefault">self</span><span class="syntaxkeyword">::</span><span class="syntaxdefault">$where_count&nbsp;</span><span class="syntaxkeyword">==&nbsp;</span><span class="syntaxdefault">0</span><span class="syntaxkeyword">)&nbsp;</span><span class="syntaxdefault">self</span><span class="syntaxkeyword">::</span><span class="syntaxdefault">$_statement&nbsp;</span><span class="syntaxkeyword">.=&nbsp;</span><span class="syntaxstring">'&nbsp;WHERE&nbsp;'</span><span class="syntaxkeyword">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;foreach&nbsp;(</span><span class="syntaxdefault">$params&nbsp;</span><span class="syntaxkeyword">as&nbsp;</span><span class="syntaxdefault">$name&nbsp;</span><span class="syntaxkeyword">=>&nbsp;</span><span class="syntaxdefault">$value</span><span class="syntaxkeyword">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxdefault">self</span><span class="syntaxkeyword">::</span><span class="syntaxdefault">$_statement&nbsp;</span><span class="syntaxkeyword">.=&nbsp;(</span><span class="syntaxdefault">self</span><span class="syntaxkeyword">::</span><span class="syntaxdefault">$where_count&nbsp;</span><span class="syntaxkeyword">>&nbsp;</span><span class="syntaxdefault">0&nbsp;</span><span class="syntaxkeyword">?&nbsp;</span><span class="syntaxstring">'&nbsp;AND&nbsp;'&nbsp;</span><span class="syntaxkeyword">:&nbsp;</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">'`&nbsp;=&nbsp;'</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 />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxdefault">self</span><span class="syntaxkeyword">::</span><span class="syntaxdefault">$where_count</span><span class="syntaxkeyword">++;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;</span><span class="syntaxdefault">self</span><span class="syntaxkeyword">::</span><span class="syntaxdefault">$_instance</span><span class="syntaxkeyword">;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;function&nbsp;</span><span class="syntaxdefault">get</span><span class="syntaxkeyword">()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;</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 />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}&nbsp;</span><span class="syntaxdefault"></span>
     
  6. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    Это порнография, поскольку кода дублируется дофига. Зачем вам статические методы? А если статические, зачем создавать экземпляр? Сделали бы статический экземпляр PDO и статическую функцию по его созданию. Но я считаю, что лучше нормальный экземпляр класса сделать. Вот синглтон базы данных схематично:
    Код (PHP):
    1. class DB {
    2.    private $pdo;
    3.    static private $inst = null;
    4.    private function __construct() {
    5.        $this->pdo = new PDO(/* параметры */);
    6.    }
    7.    
    8.    static public function instance() {
    9.       if (self::$instance === null)
    10.           self::$instance = new self();
    11.       return self::$instance;
    12.    }
    13.    
    14.    public function query() {
    15.    }
    16.    
    17.    /* И всё остальное */
    18. }
    19.  
    20. $db = DB::instance();
    21. $db->query("drop table users");
    22.  
     
  7. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    а если засунуть проверку в каждый метод, то будет ещё проще =)
     
  8. abler98

    abler98 Активный пользователь

    С нами с:
    31 авг 2014
    Сообщения:
    43
    Симпатии:
    0
    Мне это не подходит)
     
  9. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    А зачем тогда классы, если не создавать экземпляры? Ну фиг с вами. Тогда не нужно делать конструктор и создавать экземпляр - а то вы ничего не выигрываете вообще от своих статических методов (обычно так пишут те, кому жалко пару долей миллисекунды на создание экземпляра класса. Ну ещё аргумент - типа экземпляр много памяти занимает, тоже мне не очень верится)

    Кому проще? И что проверять в каждом методе? Что-то такое имеете в виду?
    Код (Text):
    1.  
    2. class DB {
    3.    static private $pdo = null;
    4.    
    5.    static private funciton init() {
    6.       if (self::$pdo === null)
    7.         self::$pdo = new PDO(/* параметры */);
    8.    }
    9.    
    10.    static public function query($q) {
    11.         self::init();
    12.         return self::$pdo->query($q);
    13.    }
    14. }
    А смысл в таком классе?
     
  10. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Да.
    Думаешь это такие жестокие накладные расходы? Спорить не хочу =) мысль высказал. Кому привычно сначала делать ссылку на экземпляр - его дело.
     
  11. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    ОК, не будем спорить. Я и создание объекта не считаю огромными накладными расходами. ТС, если хотите класс БД полностью на статических методах, возьмите мой последний пример за основу - чтоб не дублировать код создания объекта PDO в каждом классе - не красиво, и не создавать не нужный вам экземпляр класса.
     
  12. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    объект-то единожды создаётся. Тут вопрос в том, что если ты строго через метод получаешь на него ссылку, то это удобно там, где методы стоит вызывать из объекта напрямую. В случае, если у тебя методы синглтона заранее известны и ограничены, и ты проверку и создание пихаешь в каждый метод, то объект тоже создаётся только один раз, но можно сразу дёргать какие-то методы синглтона, а если надо обратиться к объекту напрямую, то можно только тогда заюзать метод со ссылкой. Экономия. =)
     
  13. runcore

    runcore Старожил

    С нами с:
    12 окт 2012
    Сообщения:
    3.625
    Симпатии:
    158
    ТС явно хочет сделать синглтон.
    по сути, синглтон - обычный класс, нестатический. но - конструктор заблокирован, клонирование заблокировано. экземпляр класса получаем через всего один статический метод.
    если ТСу хочется краткости, то можно сделать короткую функцию(внутри тот же синглтон получать) алиас, и обращаться к БД так:
    db()->select(...);
    сразу, из любого места.
     
  14. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Это очень странная формулировка. Синглтон это класс, которы либо сам, либо оборачивает экземпляр некоего класса, который существует в единственном экземпляре. В вики так же написано "с глобальной точкой доступа". Мне кажется, что раз он в одном экземпляре, то статиковая оболочка лучше всего решает этот вопрос. Эстественно, что если это "экземпляр", то это заведомо не статическая штука. Но статика формирует как раз интерфейс. В PHP статика бесплатно глобальна.
     
  15. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Отличие синглтона от статики в том, что синглтон предоставляет контекстно зависимый интерфейс. Статика же контекстно независима (должна быть, по крайней мере). Если нужно сделать некую сущность, которая должна работать в единственном экземпляре, контроллить свое состояние и общаться с внешним миром посредством пачки внешних методов, то вам нужен синглтон. Если нужно сделать эдакую библиотеку функций, связанных единой целью, которые было бы можно дергать направо и налево, вам нужна статика.

    Для БД обертки, имхо, юзайте статику.
     
  16. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    брр. кто-то путает цель и метод.
     
  17. runcore

    runcore Старожил

    С нами с:
    12 окт 2012
    Сообщения:
    3.625
    Симпатии:
    158
    ничего странного. в той же вики приведен пример кода на пхп. реализующий синглтон. посмотри.
    Это обычный класс. Из статики там только переменная - хранящая ЭКЗЕМПЛЯР класса и метод getInstance через который этот экземпляр можно получить. всё! все остальные свойства и методы нестатические и реализованы для их использования в контексте созданного объекта.

    никакая "статиковаЯ" оболочка не требуется. класс сам реализует соответсвующий метод.
     
  18. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Но это не аксиома. Я ж говорю, автоинит на мой взгляд удобнее в случае с заранее известными методами. Неужели никогда не замечали ленивую инициализацию?
     
  19. runcore

    runcore Старожил

    С нами с:
    12 окт 2012
    Сообщения:
    3.625
    Симпатии:
    158
    ну вот в getInstance и будет инициализация объекта. при первом же обращении. тоесть тогда когда уже нужны данные.
    или ты про боле ленивую?) тогда поясни
     
  20. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Ну ты проверку и вызов создания пихаешь в каждый метод как тут viewtopic.php?p=397218#p397218 и можешь без получения ссылки на объект сразу юзать методы статик-обёртки. Экономится целая строка! :D
     
  21. runcore

    runcore Старожил

    С нами с:
    12 окт 2012
    Сообщения:
    3.625
    Симпатии:
    158
    но в методе init() то у тебя все равно есть рождение объекта? так?
    а раз ВСЕ РАВНО объект создается, в чем профит от статики в данном случае? никакого.
    наоборот. весь класс пронизан копипастом. в каждом методе вызов init(). и главное зачем? когда можно сделать классическую конструкцию(синглтон). которая будет проще в реализации и делать точно тоже самое по затратам на создание объекта.

    какая строка экономится?
    всё делается и так одной строкой.
    $rows = Db::getInstance()->getRows();

    переубеждать не буду. аргументы все приведены. дело хозяйское
     
  22. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Ну слово одно. Не вижу смысла печатать каждый раз одно и то же, если можно на автомате. Чего ты так боишься?
     
  23. runcore

    runcore Старожил

    С нами с:
    12 окт 2012
    Сообщения:
    3.625
    Симпатии:
    158
    экономия должна быть экономной. но всегда есть предел.
    так рассуждая можно дойти до еще более короткого варианта:
    $data = getRows(...);
    а там внутри пусть всё втысячный раз описать, и проверки и инициализацию объекта...

    вот этого я и боюсь. что в итоге преждевременная оптимизация - приведет к обратному эффекту. и от нее появляется реальный вред.
     
  24. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    ну в любом направлении надо знать меру, конечно.