Pull to refresh

Comments 9

Что-то мне не кажется хорошей идеей использование $object::$static_public_property вместо foo::$static_public_property.

Как бы обращение к объекту подразумевает под собой динамику (объект — это динамическая сущность класса). Обращение к классу подразумевает статику («не меняется для каждого объекта»). Обращаясь за статическими свойствами к объекту вы вводите в заблуждение читателя. Я понимаю, что разница все равно есть (:: vs ->), но она становится менее заметной.

Есть один use case, когда такое может пригодиться. Когда мы не знаем, какого класса у нас объект, но хотим взять у него константу или статику. Но что-то мне кажется, что это больше «пахнет» ошибкой проектирования, чем реальной необходимостью…
Я не сторонник публичных свойств как статических так и нет. Но они есть и к ним можно таким образом обратиться, поэтому я и показал это. Не более.

Константы пишутся большими буквами, поэтому ошибиться будет сложно. Не обязательно не знать класс объекта, чтобы использовать пользоваться таким подходом.

Например из 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()
Я тоже так подумал. С другой стороны количество констант может быть достаточно велико (в данном случае 8) и добавлении большого количества таких методов будут замусоривать класс, а новых возможностей не добавит. Я думаю, что это дело вкуса.
Переопределение статики в наследниках? Правда реальный пример только вымученный приходит в голову- необходимо получить фабричным статическим методом новый объект того же класса, что и параметр метода.
Такое может быть. Взять хотя бы Активную запись, где для каждой таблицы свой класс. У всех этих классов может быть своя константа с именем таблицы в БД.
Кстати, чуть не забыл, статические методы можно вызывать и через "->".: )
Помимо
$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.

Articles