- Поисковые системы
- Практика оптимизации
- Трафик для сайтов
- Монетизация сайтов
- Сайтостроение
- Социальный Маркетинг
- Общение профессионалов
- Биржа и продажа
- Финансовые объявления
- Работа на постоянной основе
- Сайты - покупка, продажа
- Соцсети: страницы, группы, приложения
- Сайты без доменов
- Трафик, тизерная и баннерная реклама
- Продажа, оценка, регистрация доменов
- Ссылки - обмен, покупка, продажа
- Программы и скрипты
- Размещение статей
- Инфопродукты
- Прочие цифровые товары
- Работа и услуги для вебмастера
- Оптимизация, продвижение и аудит
- Ведение рекламных кампаний
- Услуги в области SMM
- Программирование
- Администрирование серверов и сайтов
- Прокси, ВПН, анонимайзеры, IP
- Платное обучение, вебинары
- Регистрация в каталогах
- Копирайтинг, переводы
- Дизайн
- Usability: консультации и аудит
- Изготовление сайтов
- Наполнение сайтов
- Прочие услуги
- Не про работу
Как снизить ДРР до 4,38% и повысить продажи с помощью VK Рекламы
Для интернет-магазина инженерных систем
Мария Лосева
Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий
Допустим есть класс
есть ещё класс:
Вопрос: как будет правильней обратиться в функции bTest к функции aTest:
или
$this->aTest();
А если в класс B будет метод aTest?
Конечно parent, т.к. this, по сути, обращение к самому себе (рекурсия) ;)
А если в класс B будет метод aTest?
подловил 😡
mark2011, parent::aTest(); скорей-всего выдаст ошибку так как идет обращение к статическому методу родительского класса. Метод aTest статическим не является. В данном случае придется использовать $this->aTest();
Ну а если ситуация следующая?
При описании будем считать что в каждом классе есть метод Test() с предваряющей буквой класса: aTest, bTest, jTest...
Итак:
class A{}
class B extends A {}
class C extends A {}
class D extends C {}
Вопрос:
Будет ли следующее?
и если существует функция
то будет ли правильным здесь обращение parent? Ведь по сути parent для класса D - это класс С.
Вопрос: как будет правильней обратиться в функции bTest к функции aTest:
или
В классе B extends A должна быть внутренняя переменная/массив типа class A, иначе нечего extend-ить (она создаётся $this->ИмяЭтойПеременной =& new A).
Обращение из класса B к свойствам/методам класса-родителя правильно выглядит как $this->ИмяЭтойПеременной->МетодКлассаA.
Тогда никаких проблем с одинаковыми названиями свойств/методов не возникает, и всегда понятно, что откуда вызывается.
В классе 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 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>";
}
}
mark2011, parent::aTest(); скорей-всего выдаст ошибку так как идет обращение к статическому методу родительского класса. Метод aTest статическим не является. В данном случае придется использовать $this->aTest();
Да ладно? o_O Хоть бы потестили, для начала, советчики блин...
---------- Добавлено 29.12.2012 в 19:48 ----------
В классе B extends A должна быть внутренняя переменная/массив типа class A, иначе нечего extend-ить (она создаётся $this->ИмяЭтойПеременной =& new A).
Обращение из класса B к свойствам/методам класса-родителя правильно выглядит как $this->ИмяЭтойПеременной->МетодКлассаA.
Тогда никаких проблем с одинаковыми названиями свойств/методов не возникает, и всегда понятно, что откуда вызывается.
Эмм... А зачем путать ТС? Он спрашивает, как расширить класс, а не как использовать другой. Ваш подход идеален для использования моделей в контроллерах, например. Т.е., в тех случаях, когда класс A не зависит от класса B, но использует класс B внутри методов класса A.
Т.С.: по Вашему вопросу ответ простой: $this-> используется только по отношению к данному объекту, в котором используется (в статичных методах вообще не может быть использован), а parent:: в отношении родительского класса (НЕ ОБЪЕКТА!). В результате parent всегда ссылается на родительский класс, а $this на первый метод в иерархии классов вверх по дереву от текущего.