2010-01-11 2 views
6

Я использую стабильную версию PHP 5.3, и иногда я сталкиваюсь с очень непоследовательным поведением. Насколько мне известно в наследовании, все атрибуты и методы (частные, общедоступные и защищенные) в супер классе передаются дочерним классом.Php Inheritance

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 :: $ _ определяется как «общедоступный», он не дает ошибок. PHP имеет собственные правила OO ???

Благодаря

Edit: Теперь все ясно. На самом деле я думал, что в «наследовании» создается новый класс и наследует всех членов, независимых от его предка. Я не знал «доступ» к правилам, и правила наследования одинаковы.

Редактировать В соответствии с вашими комментариями этот фрагмент должен дать ошибку. Но он работает.

class Foo 
{ 
    private $bar = "baz"; 

    public function getBar() 
    { 
     return $this->bar; 
    } 
} 

class Bar extends Foo 
{} 

$o = new Bar; 
echo $o->getBar();  //baz 
+1

Нет. Эти правила точно такие же, как в Java и C++, из которых была взята объектная модель PHP. – troelskn

+3

Поскольку getBar() определен в родительском классе, он может получить доступ к переменной частного члена. –

+0

return $ this-> bar; Здесь $ this относится к объекту Bar, а класс Bar не имеет переменной $ bar. Как это могло произойти? – jsonx

ответ

12

От PHP Manual:

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

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() было определено или перегружено в Bar, это не сработало. См. http://codepad.org/rlSWx7SQ

+0

+1 для фактического показа объяснения – NateDSaint

3

Ваши предположения неверны. Защищенные и публичные участники «передаются». Частных членов нет. Насколько мне известно, это типично для многих языков ООП.

1

Приватные методы и переменные не могут быть доступны дочерними классами или извне - только самим классом. Используйте Защищенный, если вы хотите, чтобы переменная была доступной для ребенка, но недоступна для внешних классов.