Вот что я хочу сделать:
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
Ответ 4
См. Википедию о оператор разрешения области видимости. Особенно смотрите раздел о PHP и иврите.
Ответ 5
Я нахожу, что эта подобная линия работает в моем приложении Laravel:
$thing->all(new Account);
Ответ 6
Попробуйте '$ this' вместо self.
Self действительно работает таким образом в PHP. PHP считает, что он встречает неизвестную константу, которую он не может найти, а затем он принимает строку, содержащую "я".
Изменить: можете ли вы опубликовать класс и код, где вы создаете экземпляр объекта?