Я использую стабильную версию PHP 5.3, и иногда я встречаюсь с очень непоследовательными поведениями. Насколько я знаю в наследовании, все атрибуты и методы (частный, общедоступный и защищенный) в суперклассе являются переданным дочерним классом.
class Foo
{
private $_name = "foo";
}
class Bar extends Foo
{
public function getName()
{
return $this->_name;
}
}
$o = new Bar();
echo $o->getName();
//Notice: Undefined property: Bar::$_name in ...\test.php on line 11
Но когда Foo:: $ _name атрибут определяется "общественность", которую он не дает ошибке. PHP имеет собственные правила OO???
Спасибо
Править: Теперь все вещи ясны. На самом деле я думал в "наследовании", новый класс создается и наследовал всех участников, независимых от его предка. Я не знал правил "доступа", и правила наследования являются тем же.
Отредактируйте Согласно своим комментариям, которые этот отрывок должен дать ошибке. Но это работает.
class Foo
{
private $bar = "baz";
public function getBar()
{
return $this->bar;
}
}
class Bar extends Foo
{}
$o = new Bar;
echo $o->getBar(); //baz
Класс XPathExpression предоставляет метод AddSort:
http://msdn.microsoft.com/en-us/library/system.xml.xpath.xpathexpression.aspx
-121--3894561-Это строка-правонарушение:
class C<out T>
Как указано в сообщении об ошибке, нельзя применять универсальную дисперсию к классам, только к интерфейсам и делегатам. Это будет нормально:
interface C<out T>
Это не так.
Для получения подробной информации см. Создание вариантов универсальных интерфейсов
-121--4213580-Ваши предположения неверны. Защищенные и открытые члены «передаются». Частные участники - нет. Насколько мне известно, это характерно для многих языков ООП.
Видимость свойства или метода можно определить с префикс Декларация с ключевыми словами
публика
,Защищенные
иличастные
. Члены класса ОбъявленПубликация
может быть доступна повсюду. Члены заявилизащищены
можно получить доступ только в классе сам и унаследованным и родителем классы. Члены объявлены в частном порядкеможет быть доступно только в классе, который Определяет член.
class A
{
public $prop1; // accessible from everywhere
protected $prop2; // accessible in this and child class
private $prop3; // accessible only in this class
}
И нет, это не отличается от других языков, реализующих одинаковые ключевые слова.
Что касается вашего второго фрагмента редактирования и кода:
Нет, это не должно давать ошибку, потому что GetBar ()
унаследован из foo
и foo
имеет видимость $ BAR
. Если GETBAR ()
был определен или перегружен в бар
, это не будет работать. См. http://codepad.org/rlswx7sq
Частные Методы и переменные не могут быть доступны доходными классами или внешне - только самим классом. Использование защищено Если вы хотите переменную доступную для ребенка, но недоступен для внешних классов.