Обращение напрямую к методам объекта внутри другого объекта?

bobroff

Новичок
Обращение напрямую к методам объекта внутри другого объекта?

Здравствуйте

К примеру есть следующие классы:
PHP:
class Apple
{
   $Grape = new Grape();

   function AppleAlert()
  {
      print('hi, Apple');   
  }
}

class Grape
{
   function GrapeAlert()
  {
      print('hi, Grape');   
  }
}
Задача: сделать так, чтобы можно было обращаться с методам класса Grape вот так:
PHP:
$element  = new Apple();
$element->GrapeAlert();
Вопрос: как это сделать?

Заранее, спасибо...
 

Вурдалак

Продвинутый новичок
Re: Обращение напрямую к методам объекта внутри другого объекта?

Автор оригинала: bobroff
PHP:
class Apple
{
   $Grape = new Grape();

   function AppleAlert()
  {
      print('hi, Apple');   
  }
}
— пробовал запустить?
 

bobroff

Новичок
Автор оригинала: Вурдалак
— пробовал запустить?
Нет, просто пример написал. Думаю функционал всем понятен.

Автор оригинала: dimagolov
это что, декоратор?

http://www.php.net/__call
Видел ,но не понял, как с помощью этого вызвать метод другого объекта "без извращений" типа использования конструкций "if...else" и перебора всех методов объекта.

Автор оригинала: ps2007
для нормального ответа недостаточно информации.
Какая задача должна решаться таким образом ?
Задача следующая: есть 2 или более объекта(модели). Необходимо, чтобы можно было встроить 1 объект в другой и вызывать его методы напрямую.
 

zerkms

TDD infected
Команда форума
bobroff
определить нужный объект в конструкторе и сохранить его в свойстве не?
 

ps2007

Новичок
Задача следующая: есть 2 или более объекта(модели). Необходимо, чтобы можно было встроить 1 объект в другой и вызывать его методы напрямую.
Это я понял из первого сообщения. Какая задача из реального мира должна решаться таким способом ?
Есть два способа:
1) наследование
PHP:
class Apple 
{
   function Alert()
  { 
      print('hi, Apple');    
  } 
}

class Grape extends Apple 
{
   function Alert()
  { 
      print('hi, Grape');
  } 
}

$item = new Apple(); или в зависимости от условий $item = new Grape();

затем
$item->Alert();
2) Агрегация
PHP:
class Apple 
{
  protected $Grape;

  function __construct()
  {
     $this->Grape = new Grape();
  }

   function GrapeAlert() 
  { 
     $this->Grape->GrapeAlert();
  } 

   function AppleAlert() 
  { 
      print('hi, Apple');    
  } 
}
 

bobroff

Новичок
Автор оригинала: ps2007
Это я понял из первого сообщения. Какая задача из реального мира должна решаться таким способом ?
[/PHP]
Попробую объяснить реальную задачу:
Есть модель пользователя, у которого есть элементы (тоже модели), наследники одного абстрактного класса. У всех элементов есть функционал, присущий каждому из элементов, который описан в абстрактном классе. Элементы: имя, e-mail, никнейм, местоположение(location).
Также есть модель местоположения (location), которая содержит свои элементы (также модели): город, регион, страна.

Задача: присоединить к элементу модели пользователя location модель location.
К примеру средствами С++ это реализуется множественным наследование.
Если в модели элемента пользователя location использовать модель location - то потеряется функциональность, присущая всем элементом данных пользователя.

Фуф... по-моему я немного перемудрил...
 

ps2007

Новичок
Допустим у нас есть модель Name (имя пользователя), которая присоединена к модели User (пользователь). Что такого уникального должна уметь делать модель Name для того, чтобы сделать ее моделью а не полем обьекта User ?

Почему бы не сделать элементы пользовательской модели обычными полями а не обьектами и не придумывать себе проблем ?
 

bobroff

Новичок
Автор оригинала: ps2007
Допустим у нас есть модель Name (имя пользователя), которая присоединена к модели User (пользователь). Что такого уникального должна уметь делать модель Name для того, чтобы сделать ее моделью а не полем обьекта User ?

Почему бы не сделать элементы пользовательской модели обычными полями а не обьектами и не придумывать себе проблем ?
С name все просто но, например, дата рождения может: выводится в определенном формате, создавать из разных форматов, перекодироваться в формат для записи в формат mysql, сравниваться с текущей датой и т.п. Если подумать, то функционал довольно большой получится.
 

ps2007

Новичок
Я дату храню в базе в формате unix timestamp, легко конвертируется в любой формат, легко вычитается, сравнивается, я до сих пор не встретился с проблемами. Хотя это не единственный выход. Говорят (сам не проверял), что эти же операции можно легко выполнять, используя родной MySQL формат дат.
С проблемой хранения разобрались. Осталась проблема отображения (даты в разных форматах; вывод красным шрифтом отрицательных чисел; другой вывод, требующий обработки перед показом). Сейчас большинство разработчиков используют паттерн MVC (или парадигму, как называют некоторые). V - слой, отвечающий за отображение, там и находится логика отображения такая как форматирование даты, вывод значения определенным цветом в зависимости от условия, прочее. Прошу обратить внимание, что бизнес логика и логика отображения это разные вещи, нужно четко понимать разницу между ними.
 

Beavis

Banned
bobroff
ну сделай чтоб поля объекта User, такие как никнейм, дата рождения и т.д., тоже были объектами... типа
$user->birthdate->format("Y-m-d");
только надо оформить __get() и __set() у класса.

ты работал когда-нибудь с ORM, например с Doctrine ?
 

bobroff

Новичок
Автор оригинала: Beavis
bobroff
ну сделай чтоб поля объекта User, такие как никнейм, дата рождения и т.д., тоже были объектами... типа
$user->birthdate->format("Y-m-d");
только надо оформить __get() и __set() у класса.
Практически так и сделано.

Автор оригинала: Beavis
bobroff
ты работал когда-нибудь с ORM, например с Doctrine ?
Нет, сейчас почитаю.

Вообще весь проект на Zend строю ;)

-~{}~ 26.01.10 17:32:

Автор оригинала: bobroff
Практически так и сделано.



Нет, сейчас почитаю.

Вообще весь проект на Zend строю ;)
Прочитал. В принципе я свои модели создаю по такому же принципу, только расширяю функционал, который выходит за рамки работы с базой данных. Например: у юзера в базе данных нет поля возраст, на зато если поле дата рождения. Соответственно в модели можно создать элемент(модель) возраста пользователя и вычислить его на основании даты рождения и текущей даты.
 

Sad Spirit

мизантроп (Старожил PHPClub)
Команда форума
До кучи: я тут поднимал похожую тему про добавление методов в класс в процессе работы.

а вотт и она
 
Сверху