2016-09-04 2 views
3

Я новичок в PHP и получил два вопроса. Когда я попробовал следующий код:«this» in class inheritance, PHP

<?php 
class Base{ 
    public function getId(){ 
     return $this->id; 
    } 
}; 


class Derived extends Base{ 
    public $id = 1; 

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

}; 


$d1 = new Derived(); 

echo $d1->id();//echo 1 
echo $d1->getId();//echo 1 
?> 

Этот код, приведенный выше, будет звучать два раза.

Однако, когда я попытался следующий код:

<?php 
class Base{ 
    public function getId(){ 
     return $this->id; 
    } 
}; 


class Derived extends Base{ 
    private $id = 1; 
    public function id(){ 
     return $this->id; 
    } 
}; 

$d1 = new Derived(); 

echo $d1->id();//echo 1 
echo $d1->getId();//Cannot access private property Derived::$id 
?> 

Вызов второй функции даст мне ошибку «не удается получить доступ к частной собственности Derived :: $ ID». Итак, мой вопрос в том, что такое $ this в базе, о которой я говорил, когда я сделал $ d1-> getId()?

Я довольно смущен тем, что если $ this относится к экземпляру d1, тогда он должен иметь доступ к частному $ id. Однако, если $ this относится к базе внутри $ d1, то как она может получить свойство $ id из класса Derived? Благодаря!

+0

Метод id() 'избыточен: он выполняет то же, что и унаследованный метод getId()' – RomanPerekhrest

+0

Поскольку '$ id' является приватным в классе Derived, он недоступен в базовом классе – RiggsFolly

+3

http: // stackoverflow ,com/questions/7469759/access-child-property-from-parent-scope – RomanPerekhrest

ответ

3

Так что мой вопрос в том, что такое $ this в базе, на которую ссылался, когда я сделал $ d1-> getId()?

$this является экземпляром экземпляра объекта, который был создан с new ключевым словом любого класса - это не сам класс, что это экземпляра этого классом. В вашем случае, поскольку вы создали $d1 с new Derived(), $this является экземпляром Derived. База не имеет доступа к частной собственности Derived, потому что базовые частные свойства - эксклюзивные классу, который их определил. Они не делятся с унаследованными классами.

Как он может получить свойство $ id из класса Derived?

Вы ищете защищен видимости:

<?php 
class Base{ 
    public function getId(){ 
     return $this->id; 
    } 
}; 


class Derived extends Base{ 
    protected $id = 1; 
    public function id(){ 
     return $this->id; 
    } 
}; 

$d1 = new Derived(); 

echo $d1->id(); 
echo $d1->getId(); 
?> 

Защищенные видимость акции с другими классами, которые наследуются с ним.

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

+0

Итак, когда я вызывал $ d1-> getId(), $ this в функции getId является базовым экземпляром, созданным внутри $ d1? –

+1

Нет, '$ this' является экземпляром Derived (потому что вы создали его с помощью' new Derived() '). Производные просто наследуют методы от Base, но это не значит, что Base получает доступ к Derived частному доступу, они все еще являются отдельными классами. – HPierce

+0

Спасибо! Я понял! –

-1

Используйте защищенный, а не частный как видимость.

Частный означает, что ваш атрибут доступен только в текущем объекте, в то время как защищенный доступен для родительских и дочерних элементов.

+0

Это может решить проблему, но он не отвечает на вопрос. – jeroen

+0

Хотелось бы ... Но я не могу отредактировать свой ответ! – enrico69

+0

Странно, не знаю, почему вы не сможете отредактировать свой собственный ответ ... – jeroen

1

Частный модификатор указывает, что свойство класса будет доступно только из этого класса. Любые подклассы или суперклассы не смогут получить доступ к этому свойству.

В вашем примере $ id является приватным для вашего класса Derived и поэтому не может быть доступен базовым классом.