Особенности класса PHP5 - PullRequest
       10

Особенности класса PHP5

3 голосов
/ 22 октября 2010

Эй, php гуру.Я сталкиваюсь с некоторыми причудливыми проблемами с областями классов, которые явно имеют отношение к некоторой причуде в php.Может кто-нибудь сказать мне, что необычные ситуации могут дать следующую ошибку ...

Неустранимая ошибка : Невозможно получить доступ к self ::, когда в * 1005 нет активной области классов* MyClass.php в строке 5

Теперь, очевидно, если бы я использовал self :: вне класса, я бы получил ошибки ... но это не так.Вот упрощенная версия ситуации ...

//file1
class MyClass{
   public static function search($args=array()){
       $results = MyDbObject::getQueryResults("some query");
       $ordered_results = self::stack($results); //Error occurs here

       return $ordered_results;
   }
   public static function stack($args){
       //Sort the results
       return $ordered_results;
   }
}

//file 2
include_once("MyClass.php");
$args = array('search_term'=>"Jimmy Hoffa");
$results = MyClass::search($args);

с учетом этой настройки, как я могу получить ошибку выше?Вот что я нашел до сих пор ...

MyClass::search($args) //does not give the error (usually)
call_user_func("MyClass::search"); // this gives the error!

Какие-нибудь другие ситуации?

Ответы [ 4 ]

1 голос
/ 22 октября 2010

Вы не передаете никаких параметров, но ваш метод их ищет.Попробуйте

call_user_func("MyClass::search", $args);

Это работает в php 5.3.1, но call_user_func("MyClass::search"); не

1 голос
/ 22 октября 2010

Если я правильно понимаю, вы ищете Позднее статическое связывание .Эта функция требует PHP версии 5.3 как минимум.

0 голосов
/ 10 июня 2012

Ваш код выглядит нормально. Если с этим что-то не так, я, должно быть, упускаю проблему. Похоже, что ваш вызов self :: полностью находится в пределах класса! И, в частности, статическая область видимости, для которой self ::. 1001 *

Из 3-го издания PHP Objects Patterns and Practice (потрясающая книга):

Для доступа к статическому методу или свойству из того же класса (а не от ребенка), я бы использовал ключевое слово self. Я должен Классы, что $ псевдо-переменная для объектов. Так что снаружи класс StaticExample, я получаю доступ к свойству $ aNum, используя его класс имя:

StaticExample::$aNum;

Внутри класса StaticExample я могу использовать ключевое слово self:

class StaticExample {`
    static public $aNum = 0;

    static public function sayHello() {
        self::$aNum++;
        print "hello (".self::$aNum.")\n";
    }
}

Итак, я не уверен, почему этот код не работал. Возможно ошибка PHP? Я столкнулся с этой ошибкой, когда пытался использовать self :: вне области видимости - моя ошибка выглядела так:

public static function get_names() {
    $machine_names = self::get_machine_names();

    return array_map(function ($machine_name) {
        $service_settings = self::get_settings_by_machine_name($machine_name);
        return $service_settings . $machine_name;
        },
        $machine_names
    );
}

Итак, я получаю ошибку, потому что я использую self :: в рамках замыкания. Чтобы исправить ошибку, я мог бы сделать этот вызов self :: get_settings_by_machine_name () перед закрытием и передать результаты в область замыкания с помощью use.

Не уверен, что происходит в вашем коде.

0 голосов
/ 22 октября 2010

Попробуйте это:

call_user_func(array('MyClass', 'search'));

См. Также пример № 4 на http://php.net/call_user_func

...