#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. На самом деле мы хотим скрыть некоторые переменные от разработчиков в дальнейшем с помощью расширенных классов. Одобренный ответ действительно поставил точку, которая ударила по голове.