Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Несколько простых вопросов по ООП, Помоги самоучке разобраться пожалуйста. 
:(
    Опции темы
user074
  Дата 19.7.2012, 09:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 19.7.2012

Репутация: нет
Всего: нет



Доброго времени суток!

Помогите пожалуйста разобраться в нескольких, наверное глупых, вопросах:

1. Что делает этот код?
Код

$a = new A;
$a->func()->func_r();


Вызывает функцию в функции? Передает результат одной функции к другой? 

2. Для чего следует использовать трейты? 
В теории я вроде как понимаю, трейты нужны в качестве замены множественного наследования.
Но как это выглядит на практике? Что обычно реализуют с помощью трейтов? Когда может понадобиться множественная наследовательность или где на практике применять трейты?


3. Паттерн MVC. Тут в принципе все понятно в теории, только непонятно как именно на практике получать в Контроллере данные из Модели.
Для этого требуется реализовать паттерн Registry и передавать через него? Или реализовать Model в виде класса с набором методов, и создавать объект Модели в Контролере? Или просто описать Model функциями и инклудить в Конструкторе? Как это делается обычно?))

4. Что делает этот код?
Код

Yii::createWebApplication($config)->run();

То что вызывает статический метод класса  понятно. Но что делает run() ? Не конкретно в этом фреймворке имеется ввиду, а что вообще может делать такая конструкция.

5. Уместно ли делать реализацию некоторых частей(возможно основных библиотек) приложения на функциях, чтобы затем вызывать их из любой точки программы не создавая объект в каждом месте, где понадобиться эта функция, как наверное пришлось бы делать, если бы эта функциональность была описана с помощью классов? 

Или другими словами: 
Код

class Links extends Model {

  function Links() {
    parent::Model();
  }

  function get_links() {
   $query = $this->db->get('links'); //то же самое, что и as Select * from links
   return $query->result();
  }
}


function index()
{
  $this->load->model('links');
  $links['links'] = $this->links->get_links();

  $data = array(
   'title' => 'Test Application',
   'current_page' => 'Welcome',
   'navigation' => $this->load->view('navigation/nav_main','',true),
   'content' => $this->load->view('content/link_list',$links,true)
  );
  $this->load->view('layout/main',$data);
}


$this->load->model('links');
$links['links'] = $this->links->get_links();

Как сделать возможность вызывать в Controller метод get_links() из  класса Links при этом не инициализируя (по крайней мере явно) объект? Псевдо-переменную $this можно предопределить? 
 smile 

Очень надеюсь на вашу помощь т.к. самоучке сложно самому разобраться иной раз в некоторых вопросах и требуется помощь более опытных коллег и  я уже похоже совсем запутался.
Заранее огромнейшее спасибо!
PM MAIL   Вверх
Fortop
Дата 19.7.2012, 11:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2200
Регистрация: 13.11.2007
Где: Донецк

Репутация: 20
Всего: 42



Цитата(user074 @  19.7.2012,  09:04 Найти цитируемый пост)
Вызывает функцию в функции? Передает результат одной функции к другой? 

http://en.wikipedia.org/wiki/Method_chaining


Цитата(user074 @  19.7.2012,  09:04 Найти цитируемый пост)
3. Паттерн MVC. Тут в принципе все понятно в теории, только непонятно как именно на практике получать в Контроллере данные из Модели.

Обратиться к методам этой модели.
Что для этого придется сделать предварительно - зависит от того, как вы писали.
Прочитать из Реестра или инициализировать инстанс класса.

Цитата(user074 @  19.7.2012,  09:04 Найти цитируемый пост)
То что вызывает статический метод класса  понятно. Но что делает run() ? Не конкретно в этом фреймворке имеется ввиду, а что вообще может делать такая конструкция.

Выполнять последовательность действий заложенных в логику выполнения приложения.
Это по логике.
На практике зависит от разработчика. Что он заложил в этот run(), то там и будет

Цитата(user074 @  19.7.2012,  09:04 Найти цитируемый пост)
5. Уместно ли делать реализацию некоторых частей(возможно основных библиотек) приложения на функциях

Почему нет?

Цитата(user074 @  19.7.2012,  09:04 Найти цитируемый пост)
Или другими словами: 

А вот для подобного перемешивания, как в примере,  я причин не вижу.



Цитата(user074 @  19.7.2012,  09:04 Найти цитируемый пост)
Как сделать возможность вызывать в Controller метод get_links() из  класса Links при этом не инициализируя (по крайней мере явно) объект?

Только статические методы для объекта.
Или lazy load и работа через сервисы и фабрики.
MyObjectFactory::create('myCoolObj')->get_links();

Но зачем?

Цитата(user074 @  19.7.2012,  09:04 Найти цитируемый пост)
Псевдо-переменную $this можно предопределить? 

Это вопрос, который проще проверить самостоятельно, чем ожидать ответа.



--------------------
Мир это Я.
Живее всех живых.
PM MAIL   Вверх
user074
Дата 19.7.2012, 15:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 19.7.2012

Репутация: нет
Всего: нет





Я наверное не так выразился, имелось ввиду как реализовать Method Chaining на php? 



Цитата

Обратиться к методам этой модели.
Что для этого придется сделать предварительно - зависит от того, как вы писали.
Прочитать из Реестра или инициализировать инстанс класса.

О том и речь, что я не знаю как правильно smile  

Цитата

инициализировать инстанс класса

Если не сложно, приведите пример, пожалуйста.

Цитата

А вот для подобного перемешивания, как в примере,  я причин не вижу.

Так реализовано в Zend Framework, мне показалось удобным способом подгружать библиотеки в контроллере.


Цитата

Только статические методы для объекта.
Или lazy load и работа через сервисы и фабрики.
MyObjectFactory::create('myCoolObj')->get_links();

Но зачем?

Чтобы подключать и работать с библиотеками (class) в контроллере(class).
Ну например чтобы плагины(модули, компоненты) в cms могли использовать библиотеки этой cms.
  smile 


Это сообщение отредактировал(а) user074 - 19.7.2012, 15:37
PM MAIL   Вверх
krypt3r
Дата 20.7.2012, 08:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 359
Регистрация: 9.6.2009

Репутация: 3
Всего: 16



Цитата
Я наверное не так выразился, имелось ввиду как реализовать Method Chaining на php?

Небольшой пример:
Код

<?php
  class B {
    function func_r () {
      echo 'Hello from class B!', "\n";
    }
  }
  
  class A {
    function func () {
      $b = new B;
      return $b;
    }
  }
  
  $a = new A;
  $a->func()->func_r();
?>


Пункт 4. Пример. Наверно, грубый, но рабочий.
Код

<?php
  class Config {
    private $config;
    
    function __construct ($config) {
      $this->config = $config;
    }
    
    function run () {
      echo 'You load config «', $this->config, "»\n";
    }
  }
  
  class Yii {
    static function createWebApplication ($config) {
      $cfg = new Config ($config);
      return $cfg;
    }
  }
  
  $config = 'Myconfig.php';
  Yii::createWebApplication($config)->run();
?>


Это сообщение отредактировал(а) krypt3r - 20.7.2012, 08:45
PM MAIL   Вверх
Fortop
Дата 20.7.2012, 15:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2200
Регистрация: 13.11.2007
Где: Донецк

Репутация: 20
Всего: 42



Цитата(user074 @  19.7.2012,  15:35 Найти цитируемый пост)
О том и речь, что я не знаю как правильно
Если не сложно, приведите пример, пожалуйста.

Как удобнее.

В последнее время более "модным" считается делегирование и инъекция зависимостей, а не глобальная область видимости.

т.е. как-то так:

Код

$view = new View(new Paginator(new Db(new MySQL_Connector())));

echo $view;


Код

$model = new Model( new Db(new MySQL_Connector()));
$record = $model->fetch('115');

$model->setDb(new Db(new Redis_Connector()));
$model->save($record);



Цитата(user074 @  19.7.2012,  15:35 Найти цитируемый пост)
Так реализовано в Zend Framework,

Я достаточно хорошо его знаю, чтобы не поверить в это.
В ZF нет такой смеси процедурного и ООП стиля.

Цитата(user074 @  19.7.2012,  15:35 Найти цитируемый пост)
Ну например чтобы плагины(модули, компоненты) в cms могли использовать библиотеки этой cms

А какие могут быть проблемы?
Они же в отличии от CMS знают о существовании этой библиотеки.

А чтобы CMS могла подключать неизвестные плагины и модули, нужно хотя бы простое API
например:

Код

interface Module {
    // для того чтобы CMS знала можно ли запускать этот плагин
    public function getDependencyList();
    // Какая-либо инициализация перед запуском
    public function init();
    // Настройки которые можно менять в админке
    public function configure();

    // выполнение модуля
    public function run();
}



Простейшая работа с модулем будет идти примерно так:
Код

$required = $module->getDependency();
$available = array_intersect($app->getAvailableClassList(), $required);
if ( $available == $required) {
     try {
        $module->init();
        $module->run();
    } catch (Exception $e) {
        // чего-нибудь делаем
    }
} else {
    throw new Exception('отсутствуют классы: ' . print_r(array_diff($required, $available), true));
}




--------------------
Мир это Я.
Живее всех живых.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0735 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.