Один вопрос по ООП

M2
На сайте с 11.01.2011
Offline
341
661

Допустим есть класс


class A
{
public function aTest()
{

}
}

есть ещё класс:


class B extends A
{
public function bTest()
{

}
}

Вопрос: как будет правильней обратиться в функции bTest к функции aTest:


$this->aTest();

или


parent::aTest()
------------------- Крутые VPS и дедики. Качество по разумной цене ( http://cp.inferno.name/view.php?product=1212&gid=1 ) VPS25OFF - скидка 25% на первый платеж по ссылке выше
O3
На сайте с 17.11.2008
Offline
127
#1

$this->aTest();
siv1987
На сайте с 02.04.2009
Offline
427
#2
oleg3d:
$this->aTest();

А если в класс B будет метод aTest?

A
На сайте с 29.12.2007
Offline
68
#3

Конечно parent, т.к. this, по сути, обращение к самому себе (рекурсия) ;)

O3
На сайте с 17.11.2008
Offline
127
#4
siv1987:
А если в класс B будет метод aTest?

подловил 😡

TA
На сайте с 12.06.2009
Offline
116
TiA
#5

mark2011, parent::aTest(); скорей-всего выдаст ошибку так как идет обращение к статическому методу родительского класса. Метод aTest статическим не является. В данном случае придется использовать $this->aTest();

Профессиональная верстка и разработка сайтов на WordPress (http://www.maultalk.com/topic139110s0.html)
M2
На сайте с 11.01.2011
Offline
341
#6

Ну а если ситуация следующая?

При описании будем считать что в каждом классе есть метод Test() с предваряющей буквой класса: aTest, bTest, jTest...

Итак:

class A{}

class B extends A {}

class C extends A {}

class D extends C {}

Вопрос:

Будет ли следующее?


$d = new D();
$d->aTest()

и если существует функция


class D extends C
{
public function dTest()
{
echo $this->aTest();
}
}

то будет ли правильным здесь обращение parent? Ведь по сути parent для класса D - это класс С.

L
На сайте с 07.12.2007
Offline
351
#7
mark2011:
class B extends A
{
public function bTest()
{

}
}


Вопрос: как будет правильней обратиться в функции bTest к функции aTest:
$this->aTest();


или
parent::aTest()

В классе B extends A должна быть внутренняя переменная/массив типа class A, иначе нечего extend-ить (она создаётся $this->ИмяЭтойПеременной =& new A).

Обращение из класса B к свойствам/методам класса-родителя правильно выглядит как $this->ИмяЭтойПеременной->МетодКлассаA.

Тогда никаких проблем с одинаковыми названиями свойств/методов не возникает, и всегда понятно, что откуда вызывается.

rbbumfirst
На сайте с 03.04.2009
Offline
87
#8
Ladycharm:
В классе B extends A должна быть внутренняя переменная/массив типа class A, иначе нечего extend-ить (она создаётся $this->ИмяЭтойПеременной =& new A).

Обращение из класса B к свойствам/методам класса-родителя правильно выглядит как $this->ИмяЭтойПеременной->МетодКлассаA.
Тогда никаких проблем с одинаковыми названиями свойств/методов не возникает, и всегда понятно, что откуда вызывается.

Расскажите что за паттерн такой?

а по теме - нет разницы как обращаться. parent::aTest() или $this->aTest();

оба метода отработают верно. только в случае наследования метода aTest(), как было замечено выше, вариант $this->aTest(); отработает из текущего класса. обычно используют parent только в случае перекрытия методов:

class B extends A {



function aTest(){
parent::aTest();

/* ... */
/* ... */
echo "1";
/* ... */
/* ... */

}

}

если у вас много классов, наследующих предыдущий

то тут уже вам решать наследовать родителей или нет


class C extends B {};
class E extends C {
function aTest(){
return parent::aTest();

}
}

class F extends E {
function aTest(){

echo "2";

}
}


$cObj = new C();
$eObj = new E();
$fObj = new F();

$cObj->aTest(); // echo 1
$eObj->aTest(); // echo 1
$fObj->aTest(); // echo 2

Web developer (http://rudov.com). разработка на Go, ReactJS, React Native
L
На сайте с 07.12.2007
Offline
351
#9
rbbumfirst:
Расскажите что за паттерн такой?

Если не лень разбираться в коде:

[] заменены на {} тк движок форума их коверкает

class Link {

var $href;
var $anchor;

function Prnt() { // Распечатка переменных класса
echo "________________________<br>";
echo "| Ссылка: '".$this->href."'<br>";
echo "| Якорь: '".$this->anchor."'<br>";
echo "----------------------<br><br>";
}
}

class LinkS extends Link {
var $arr = array(); // Массив объектов класса Link
var $cnt; // Число объектов класса Link

function Add($href, $anchor) { // Добавление нового объекта
$this->arr{} =& new Link($href, $anchor); // Создание объекта класса Link
$this->cnt++;
}

function Prnt() { // Распечатка переменных класса
echo "====================================================<br>";
for($i=0; $i<$this->cnt; $i++)
$this->arr{ $i }->Prnt(); // Prnt() от класса Link
echo "Элементов: ".$this->cnt.'<br>';
echo "====================================================<br>";
}
}

$this->arr[ $i ]->Prnt();	// Вызов в классе LinkS Prnt() от класса Link

$this->Prnt(); // Вызов в классе LinkS собственного Prnt()
A
На сайте с 29.12.2007
Offline
68
#10
TiA:
mark2011, parent::aTest(); скорей-всего выдаст ошибку так как идет обращение к статическому методу родительского класса. Метод aTest статическим не является. В данном случае придется использовать $this->aTest();

Да ладно? o_O Хоть бы потестили, для начала, советчики блин...

---------- Добавлено 29.12.2012 в 19:48 ----------

Ladycharm:
В классе B extends A должна быть внутренняя переменная/массив типа class A, иначе нечего extend-ить (она создаётся $this->ИмяЭтойПеременной =& new A).

Обращение из класса B к свойствам/методам класса-родителя правильно выглядит как $this->ИмяЭтойПеременной->МетодКлассаA.
Тогда никаких проблем с одинаковыми названиями свойств/методов не возникает, и всегда понятно, что откуда вызывается.

Эмм... А зачем путать ТС? Он спрашивает, как расширить класс, а не как использовать другой. Ваш подход идеален для использования моделей в контроллерах, например. Т.е., в тех случаях, когда класс A не зависит от класса B, но использует класс B внутри методов класса A.

Т.С.: по Вашему вопросу ответ простой: $this-> используется только по отношению к данному объекту, в котором используется (в статичных методах вообще не может быть использован), а parent:: в отношении родительского класса (НЕ ОБЪЕКТА!). В результате parent всегда ссылается на родительский класс, а $this на первый метод в иерархии классов вверх по дереву от текущего.

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий