Как я могу защитить свойство класса от расширения классов в PHP?

#php #class #visibility #private #class-visibility

#php #класс #видимость #Частное #видимость класса

Вопрос:

Возможно ли сделать что-то подобное:

 class foo {
    private $private = 'A';
}

class bar extends foo {
    echo $this->private;
}

bar returns null...
  

Мне бы очень хотелось, чтобы переменная $ private не была доступна дочерним классам, но я не уверен, что это вообще возможно, основываясь просто на парадигме разработки на основе классов.

Частные свойства НЕ обеспечивают функциональность, которую я ищу.

Я понимаю, что это не точный PHP-код, но это всего лишь пример 😉

Ответ №1:

Вот как это уже работает. Смотрите документацию:

Видимость свойства или метода может быть определена путем добавления в объявление ключевых слов public, protected или private. Члены класса, объявленные общедоступными, могут быть доступны везде. Члены, объявленные защищенными, могут быть доступны только внутри самого класса, а также унаследованными и родительскими классами. Члены, объявленные как private, могут быть доступны только классу, который определяет член.

Смотрите пример здесь:http://codepad.org/Yz4yjDft

Частные свойства НЕ обеспечивают функциональность, которую я ищу.

Мне кажется, это именно то, что вы хотите. Если нет, пожалуйста, уточните.

Комментарии:

1. после небольшого размышления — наш дочерний класс не записывал в родительское свойство ‘private’ — он создавал свою собственную переменную в этом пространстве имен, потому что он не знает, что родительская переменная существует. мы протестировали это с parent::$private. Забавный небольшой тест для меня 😉

Ответ №2:

 class foo {
    protected $private = 'A';
}

class bar extends foo {
    function __construct() {
        echo $this->private;
    }
}
 new bar();

// will echo 'A' 
  

Вам просто нужно выполнить обработку внутри функции, вы не можете иметь echo только внутри вашего класса.

Редактировать:

protected позволит вам использовать переменную только в классах-потомках. если это то, что вы ищете

Комментарии:

1. И какая версия PHP это делает?

2. На самом деле мы хотим скрыть некоторые переменные от разработчиков в дальнейшем с помощью расширенных классов. Одобренный ответ действительно поставил точку, которая ударила по голове.