потому что синтаксис такой.
Во втором случае не удивительно потому что вы в класе обращаетесь к фенкции Test() а надо к $this->test()
----- Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
LIME
Отправлено: 26 Июля, 2011 - 23:42:55
Активный участник
Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010
Помог: 322 раз(а)
OrmaJever пишет:
потому что синтаксис такой.
может потому что абстрактные методы должны быть реализованы в потомках пусть даже пустым оператором?
romantik2011
Отправлено: 26 Июля, 2011 - 23:49:46
Новичок
Покинул форум
Сообщений всего: 62
Дата рег-ции: Июль 2011
Помог: 0 раз(а)
Да, точно, меня интересует пример №1.
Скажите, какой же здесь полиморфизм, как говорится в книге, что мол в методе класса-родителя вызывается метод класса потомка, но объект же создаётся класса-потомка всё-таки.
Вот, смотрите:
$a->Call();// выводит "Test from A" |объект создался от класса А, значит и функц. класса А вызывается
$b->Test();// выводит "Test from B" |объект создался от класса B, значит и функц. класса B вызывается
$b->Call();// Внимание! Выводит "Test from B"! |Так здесь наоборот вызывается метод из класса-родителя в классе-потомке, а не в классе-родителя вызывается метод потомка
Если полиморфирзм - это когда метод в классе-родителе вызывает метод класса-потомка, я не вижу чтоб здесь в классе-родите вызывался метод-класса-потомка, объект всё равно же создаётся от потомка, а не от родителя.
LIME
Отправлено: 26 Июля, 2011 - 23:56:00
Активный участник
Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010
Помог: 322 раз(а)
romantik2011 пишет:
как говорится в книге, что мол в методе класса-родителя вызывается метод класса потомка,
тут что-то напутано по-моему
полиморфизм это когда переопределяются родительские методы
то есть метод одинаково называется но вызывается свой для каждого класса
другими словами какое-то действие (например прорисовка) выполняется по разному для разного класса (например геометрической фигуры) но вас это не парит вы просто указываете чтото->прорисовать (Добавление)
romantik2011 пишет:
Так здесь наоборот вызывается метод из класса-родителя в классе-потомке,
все верно ... а то что наоборот было написано это чушь какая-то по моему
поправьте если это не так
OrmaJever
Отправлено: 27 Июля, 2011 - 00:16:04
Активный участник
Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010 Откуда: Чернигов
Помог: 299 раз(а)
LIME пишет:
все верно ... а то что наоборот было написано это чушь какая-то по моему
бывает и так
romantik2011 пишет:
Если полиморфирзм - это когда метод в классе-родителе вызывает метод класса-потомка, я не вижу чтоб здесь в классе-родите вызывался метод-класса-потомка, объект всё равно же создаётся от потомка, а не от родителя.
Вот примеду небольшой пример (работать будет только в 5.3 и выше)
$A->getA();// предсказуемо, берёт $a из своего класа
$B->getA();// берёт $a из класа потомка
У класа B нету метода getA(), поэтому он берётся из родителя, а родительский метод берёт свойство потомка. Причём если в класе В зделать свойство private то будет ругатся что родитель не может получить доступ к потомку. Вот так вот
----- Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
LIME
Отправлено: 27 Июля, 2011 - 00:20:58
Активный участник
Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010
Помог: 322 раз(а)
ага...понятно
на самом деле это не родительский метод а метод потомка но унаследован от родителя (Добавление)
OrmaJever пишет:
Причём если в класе В зделать свойство private то будет ругатся что родитель не может получить доступ к потомку.
хотя с этим тогда загвоздка ))
OrmaJever
Отправлено: 27 Июля, 2011 - 00:40:21
Активный участник
Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010 Откуда: Чернигов
Помог: 299 раз(а)
LIME пишет:
на самом деле это не родительский метод а метод потомка но унаследован от родителя
LIME пишет:
Цитата:
Причём если в класе В зделать свойство private то будет ругатся что родитель не может получить доступ к потомку.
хотя с этим тогда загвоздка ))
сразу обьяснение. Это суровые реалии програмирования
----- Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
Stierus
Отправлено: 27 Июля, 2011 - 12:36:44
Рекордсмен по количеству сообщений за 7 дней
Покинул форум
Сообщений всего: 2132
Дата рег-ции: Дек. 2008 Откуда: Москваль
Помог: 52 раз(а)
Цитата:
Причём если в класе В зделать свойство private то будет ругатся что родитель не может получить доступ к потомку.
Родителя нет, есть 1 класс, у которого часть методов описаны в нем самом, часть методов наследуется. А ругаться будет не на то, что мифический родитель не может получить доступ к потомку, а в том, что ты пытаешься переопределить область видимости переменной, этого делать нельзя.
Мелкий
Отправлено: 27 Июля, 2011 - 12:48:56
Активный участник
Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009 Откуда: Россия, Санкт-Петербург
Помог: 618 раз(а)
Stierus пишет:
а в том, что ты пытаешься переопределить область видимости переменной, этого делать нельзя.
Покинул форум
Сообщений всего: 2132
Дата рег-ции: Дек. 2008 Откуда: Москваль
Помог: 52 раз(а)
Под нельзя имелось ввиду, что если у родителя приватное свойство - потомок его тупо не видит и моеж определить свое с т аким же именем, а вот если у родителя паблик, а в потомке ты из паблик попытаешься сделать приват - тебя пошлет лесом. (Добавление)
Возможно в php 5.3 ситуацию исправили, в php 5.2 точно
Мелкий
Отправлено: 27 Июля, 2011 - 13:06:43
Активный участник
Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009 Откуда: Россия, Санкт-Петербург
Помог: 618 раз(а)
Да, public ругается.
private - запросто появляется ещё одно свойство, protected - свойство заменяется.
----- PostgreSQL DBA
OrmaJever
Отправлено: 27 Июля, 2011 - 16:32:58
Активный участник
Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010 Откуда: Чернигов
Помог: 299 раз(а)
Stierus пишет:
Родителя нет, есть 1 класс, у которого часть методов описаны в нем самом, часть методов наследуется. А ругаться будет не на то, что мифический родитель не может получить доступ к потомку, а в том, что ты пытаешься переопределить область видимости переменной, этого делать нельзя.
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.