Comments 9
Что-то мне не кажется хорошей идеей использование $object::$static_public_property вместо foo::$static_public_property.
Как бы обращение к объекту подразумевает под собой динамику (объект — это динамическая сущность класса). Обращение к классу подразумевает статику («не меняется для каждого объекта»). Обращаясь за статическими свойствами к объекту вы вводите в заблуждение читателя. Я понимаю, что разница все равно есть (:: vs ->), но она становится менее заметной.
Есть один use case, когда такое может пригодиться. Когда мы не знаем, какого класса у нас объект, но хотим взять у него константу или статику. Но что-то мне кажется, что это больше «пахнет» ошибкой проектирования, чем реальной необходимостью…
Как бы обращение к объекту подразумевает под собой динамику (объект — это динамическая сущность класса). Обращение к классу подразумевает статику («не меняется для каждого объекта»). Обращаясь за статическими свойствами к объекту вы вводите в заблуждение читателя. Я понимаю, что разница все равно есть (:: vs ->), но она становится менее заметной.
Есть один use case, когда такое может пригодиться. Когда мы не знаем, какого класса у нас объект, но хотим взять у него константу или статику. Но что-то мне кажется, что это больше «пахнет» ошибкой проектирования, чем реальной необходимостью…
Я не сторонник публичных свойств как статических так и нет. Но они есть и к ним можно таким образом обратиться, поэтому я и показал это. Не более.
Константы пишутся большими буквами, поэтому ошибиться будет сложно. Не обязательно не знать класс объекта, чтобы использовать пользоваться таким подходом.
Например из zf2.
Можно заменить на.
На мой взгляд читаемость не снизилась, а может быть даже и повысились. Ведь сразу видно, что это константа класса именно этого объекта.
При переименовании класса, при таком подходе, потребуется внести меньше измененей.
Константы пишутся большими буквами, поэтому ошибиться будет сложно. Не обязательно не знать класс объекта, чтобы использовать пользоваться таким подходом.
Например из zf2.
public function __construct(InternalType\AbstractTypeObject $dictionary, \SplObjectStorage $processedDictionaries = null)
{
if ($dictionary->getType() != InternalType\AbstractTypeObject::TYPE_DICTIONARY) {
throw new Pdf\Exception('$dictionary mast be an indirect dictionary object.');
}
Можно заменить на.
public function __construct(InternalType\AbstractTypeObject $dictionary, \SplObjectStorage $processedDictionaries = null)
{
if ($dictionary->getType() != $dictionary::TYPE_DICTIONARY) {
throw new Pdf\Exception('$dictionary mast be an indirect dictionary object.');
}
На мой взгляд читаемость не снизилась, а может быть даже и повысились. Ведь сразу видно, что это константа класса именно этого объекта.
При переименовании класса, при таком подходе, потребуется внести меньше измененей.
По мне так, это
нужно заменять на
$dictionary->getType() != $dictionary::TYPE_DICTIONARY
нужно заменять на
$dictionary->isDictionary()
Переопределение статики в наследниках? Правда реальный пример только вымученный приходит в голову- необходимо получить фабричным статическим методом новый объект того же класса, что и параметр метода.
Кстати, чуть не забыл, статические методы можно вызывать и через "->".: )
Помимо
работает также и
с именем класса в $string, php же, надо же и так, и сяк… :)
$object::static_method()
работает также и
$string::static_method()
с именем класса в $string, php же, надо же и так, и сяк… :)
Тут скрываются некоторые нюансы с namespace.
Класс для экспериментов.
Так работать не будет.
А вот так будет.
Класс для экспериментов.
namespace foo;
class bar{
const BAZ = 'baz';
}
Так работать не будет.
$string = 'bar';
echo $string::BAZ; // Fatal error: Class 'bar' not found
А вот так будет.
$string = __NAMESPACE__.'\bar';
echo $string::BAZ; // baz
$string = 'foo\bar';
echo $string::BAZ; // baz
Sign up to leave a comment.
Доступ к статическим данным