PHP: ограничение области действия статической переменной определенным классом - PullRequest
2 голосов
/ 03 марта 2012
abstract class Mother {
        protected static $foo = null;
        protected static $bar = null;

        public function getFoo() { return static::$foo; }
        public function getBar() { return static::$bar; }
        public function setFoo($foo) { static::$foo = $foo; }
        public function setBar($bar) { static::$bar = $bar; }
}

class Brother extends Mother {
        protected static $foo = 'BROTHERS';
}

class Sister extends Mother {
        protected static $foo = 'SISTERS';
}

$brother1 = new Brother();
$brother2 = new Brother();
$sister1 = new Sister();
$sister2 = new Sister();

$sister1->setBar('ONLY SISTERS'); // We set $bar = 'ONLY SISTERS' at sister1.
// We want only Sister instances to get this value...
// however Brother instances also get this value!

    echo '<p>Brother 1: Foo="'.$brother1->getFoo().'", Bar="'.$brother1->getBar().'"</p>';
// Foo="BROTHERS", Bar="ONLY SISTERS"
    echo '<p>Brother 2: Foo="'.$brother2->getFoo().'", Bar="'.$brother2->getBar().'"</p>';
// Foo="BROTHERS", Bar="ONLY SISTERS"
    echo '<p>Sister 1: Foo="'.$sister1->getFoo().'", Bar="'.$sister1->getBar().'"</p>';
// Foo="SISTERS", Bar="ONLY SISTERS"
    echo '<p>Sister 2: Foo="'.$sister2->getFoo().'", Bar="'.$sister2->getBar().'"</p>';
// Foo="SISTERS", Bar="ONLY SISTERS"

Так что, очевидно, если static :: $ bar явно не переопределено в каждом дочернем элементе (брат, сестра), их родительский элемент (мать) установит значение для них (или, по крайней мере, для тех, кто его не переопределил).

Вопрос : Есть ли способ запретить детям, которые не переопределяют static :: $ bar, получить новое значение?Другими словами, как убедиться, что только указанный класс получит новое значение, ДАЖЕ, если static :: $ bar явно не переопределено в каждом дочернем элементе?

Ответы [ 2 ]

2 голосов
/ 03 марта 2012

Нет, не так, как вы это делаете. Вот для чего нужен частный прицел. Дочерние классы наследуют все открытые и защищенные статические свойства - это означает, что все они указывают на одно и то же значение, независимо от того, являются ли они родительским, дочерним или родственным.

Это правильно и хорошо ОО.

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

Предоставьте статические методы получения и установки в вашем классе для доступа к частному статическому свойству.

Brother::getFoo();
Sister::getFoo();

Вы можете сделать getFoo () в родительском классе Mother абстрактным или нет, если вам нужен прямой доступ к нему, сделайте его неабстрактным, так что вы можете сделать:

Mother::getFoo();
1 голос
/ 05 марта 2012

Это просто безумие.

Вы должны понимать, что extend определяет IS отношение. Например: class Duck extends Bird{} это означает, что каждый экземпляр Duck является Bird.

Итак, в вашем примере каждый Brother является Mother. Я не понимаю, как это будет иметь смысл.


И еще одна вещь: какого черта вы злоупотребляете статическими переменными? То, что вы делаете там, не является объектно-ориентированным программированием. Вы просто оборачиваете переменные и функции глобальной области видимости в пространство имен (которое выглядит как класс).

Некоторые дополнительные ссылки на эту тему могут быть вам полезны:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...