PHP, передающий имя класса, становится строкой при передаче функции

Вот что я хочу сделать:

public function all($model) {
  $query = 'SELECT ' . implode(', ', $model::$fields) ....;
}

Вызывается следующим образом:

$thing->all(Account);

Я получаю эту ошибку:

Parse error: syntax error, unexpected T_PAAMAYIM_NEKUDOTAYIM in /home/mark/public_html/*/account.php on line 15

При проверке $model с var_dump получается строка. В первом примере, если я изменяю $model на Account на строке $query, он отлично работает.

Как взять строку и вернуть ее обратно в класс?

Изменить: обновленный пример и заголовок для отражения проблемы не с self.

Решение. Поскольку я не использую PHP5.3, мне приходилось прибегать к использованию eval(), чтобы получить то, что я хотел. Спасибо всем!

Ответ 1

Классы не являются первоклассными гражданами в PHP, поэтому они могут не храниться в переменных, передаваться как аргументы функции или возвращаться из функций.

Однако PHP позволит вам моделировать первоклассного гражданина, используя строку, содержащую имя класса, в определенных ситуациях:

$class = "Account";

$instance = new $class(); // You can create instances

call_user_func(array($class, 'frobnicate')); // You can call static functions

Что обо всем в PHP < 5.3. Однако с PHP 5.3 вы также можете:

$class::frobnicate(); // cleanly call static functions

$fields = $class::$fields; // access static variables

Ответ 2

Я также испытал получение такой Fatal Error: Class 'MyClass' not found, когда у вас есть определенное пространство имен, тогда это, вероятно, пространство имен. Вы также должны указать пространство имен в своей переменной String.

$class = "App\MyClass"; // mention the namespace too
$instance = new $class();

Ответ 3

Вы не можете использовать self следующим образом: его можно использовать только в статическом контексте (т.е. внутри статического метода), чтобы указать на класс, а не на его имя.

Если вы работаете с нестатистическими методами (кажется, вы есть), вы должны использовать $this вместо self.


На самом деле, перед PHP 5.3 вы не можете использовать статический метод/данные с именем класса "dynamic" (т.е. содержаться в переменной) - см. Примеры на странице Статическое ключевое слово: они работают только с PHP 5.3, для такого рода манипуляций.

Это означает, что часть кода подобна этой:

class ClassA {
    public static $data = 'glop';
}

$className = 'ClassA';
var_dump($className::$data);

Не будет работать с PHP < 5.3

Ответ 5

Я нахожу, что эта подобная линия работает в моем приложении Laravel:

$thing->all(new Account);

Ответ 6

Попробуйте '$ this' вместо self.

Self действительно работает таким образом в PHP. PHP считает, что он встречает неизвестную константу, которую он не может найти, а затем он принимает строку, содержащую "я".

Изменить: можете ли вы опубликовать класс и код, где вы создаете экземпляр объекта?