PHP делает класс наследуемым - PullRequest
       10

PHP делает класс наследуемым

1 голос
/ 30 сентября 2010

У меня есть 2 класса A и B, которые расширяют A. A имеет открытое свойство, и я хочу, чтобы в экземплярах B это свойство не было доступно. Я пытаюсь объяснить лучше:

class A
{
    public $prop;
}
class B extends A
{
    ...
}
$instance=new B;
$instance->prop; //This must throw an error like "Undefined property prop"

Я пробовал с ключевым словом final, но оно доступно только для методов, а не для свойств. Я также попытался установить то же свойство, что и private на B, но PHP не позволяет изменить уровень доступа с открытого на частный или защищенный.

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

Ответы [ 3 ]

3 голосов
/ 30 сентября 2010

Просто измените public $prop; на private $prop;, сделав $ prop public, вы сделаете его доступным для всех возможных способов, но, сделав его private, вы сделаете его доступным только в классе

1 голос
/ 30 сентября 2010

Использование магические методы

class A {
    protected $_prop;
    public function __get($key) {   
        if ($key=='prop') {
            return $this->_prop;
        }
    }

    public function __set($key, $value) {
        if ($key=='prop') {
            return $this->_prop = $value;
        }
    }
}

class B extends A {
    public function __get($key) {
    }

    public function __set($key, $value) {
    }

    // how you can use it
    public function foo() {
        echo $this->_prop;
    }
}
1 голос
/ 30 сентября 2010

Хм.Tricky!

Единственная идея, которая приходит на ум, - это сделать $prop приватной с самого начала и использовать магические функции получения и установки для управления доступом.Вам придется хранить информацию о доступе в отдельном массиве, а затем либо возвращать правильное значение, либо выдавать фатальную ошибку в функции получения.

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