ФорумПрограммированиеPHP для идиотовPHP и ООП → Делегирование

Делегирование

  • Lirck

    Сообщения: 1658 Репутация: N Группа: Джедаи

    Spritz 30 сентября 2008 г. 0:35

    Есть 4 касса:
    error_reporting(E_ALL);

    class Test
    {
    public function index()
    {
    echo 'index';
    }
    }

    class Loader
    {
    public function __construct()
    {
    $this->test = new Test;
    }
    }

    class Controller
    {
    public function __construct()
    {
    $this->load = new Loader;
    }
    }

    class Sample extends Controller
    {
    public function __construct()
    {
    parent::__construct();

    $this->load->test->index();
    }
    }

    new Sample;


    Как мне из класса Sample вызвать метод класса Test без load в $this->load->test->index(), то есть $this->test->index()?
  • Trej Gun

    Сообщения: 5299 Репутация: N Группа: в ухо

    Spritz 30 сентября 2008 г. 1:23, спустя 48 минут 40 секунд

    ты вообще походу не соображаешь что делаешь

    делегировании это установление одно объекта свойством другого


    class A {
    public function myMethod(){
    }
    }


    делегировании в конструктор (активное)

    class B{
    public $A;
    public function __constructor($a){
    $this->A = $a;
    }
    }

    $a = new A;
    $b = new B($a);


    делегировании в конструктор (пассивное)

    class B{
    public $A;
    public function __constructor(){
    $this->A = new A();
    }
    }

    $b = new B();


    делигирование через иньекцию

    class B{
    public $A;
    public function setA($a){
    $this->A = $a;
    }
    }

    $a = new A;
    $b = new B;
    $b->setA($a)


    в результате ты можешь вызывать методы класса А через В

    $b->A->myMethod();



    ответ на твой вопрос "никак" потому что ты не понял что ты сделал, потому что лоадер не лоадит на самом деле ничего

  • Lirck

    Сообщения: 1658 Репутация: N Группа: Джедаи

    Spritz 30 сентября 2008 г. 1:31, спустя 7 минут 48 секунд

    ты вообще походу не соображаешь что делаешь

    (:
  • adw0rd

    Сообщения: 22905 Репутация: N Группа: в ухо

    Spritz 30 сентября 2008 г. 1:36, спустя 5 минут 8 секунд

    CTAPbIu_MABP, давай вводный курс в ООП для aivee проведи :) Заодно в F.A.Q. разместишь :)
    adw/0
  • Lirck

    Сообщения: 1658 Репутация: N Группа: Джедаи

    Spritz 30 сентября 2008 г. 1:39, спустя 2 минуты 56 секунд

    class A
    {
       public $b;

       public function __construct()
       {
           $this->b = new B;
       }
    }

    class B
    {
       public function method($string)
       {
           echo $string;
       }
    }

    $a = new A;

    $a->b->method('test');


    Так, а что с этим делать можно?

    Типа объединить всё приложение в один класс?
  • adw0rd

    Сообщения: 22905 Репутация: N Группа: в ухо

    Spritz 30 сентября 2008 г. 1:41, спустя 2 минуты 4 секунды


    Так, а что с этим делать можно?


    в каком плане?
    adw/0
  • Trej Gun

    Сообщения: 5299 Репутация: N Группа: в ухо

    Spritz 30 сентября 2008 г. 2:04, спустя 23 минуты 15 секунд

    adw0rd, yes ser

    aivee, с этим можно делать все

    вот тебе пример лоадера


    class Loader{
    public function load($name){
    require_once("/lib/".$name.".php");
    return new $name();
    }
    }


    и самый как по мне класический пример дилигирования


    class XML_reader(){
    public function __construct($xml){
    $this->xml = $this->parse($xml)
    }
    private function parse(){
    // тут какая-то логика
    }
    }

    class XML_node{
    private $inner_nodes = array();
    private $text = "";
    private $name = "";
    private $attrs = array();

    public getNodeByName($name){
    foreach ($node in $this->nodes)
    if($node->getName() == $name)
    $result[] = $node;
    return $result;
    }

    public function getName(){
    return $this->name;
    }

    public function getAttr($name){
    return $this->attrs[$name];
    }
    }

    // ну и дальше в том же духе
    // в результат е получаем парсер XML
    // в котором можно обращаться к нодам как в вложеным объектам

    $xml = XML_reader("<root><children myAttr='myValue'></root>");
    $myValue = $xml->getNodeByName("root")->getNodeByName("children")->getAttr("myAttr");
  • NRG

    Сообщения: 4761 Репутация: N Группа: в ухо

    Spritz 30 сентября 2008 г. 2:13, спустя 8 минут 56 секунд

    CTAPbIu_MABP, с тебя полюбому статья про ООП ! =)
  • sap

    Сообщения: 2701 Репутация: N Группа: Кто попало

    Spritz 30 сентября 2008 г. 3:49, спустя 1 час 36 минут 8 секунд

    Во блин, сколько юзал, а не знал как называется :)

    P.S. Перенесите в ООП.
  • Trej Gun

    Сообщения: 5299 Репутация: N Группа: в ухо

    Spritz 30 сентября 2008 г. 3:59, спустя 9 минут 48 секунд

    sap, да у меня с теорией тож не очень
  • Trej Gun

    Сообщения: 5299 Репутация: N Группа: в ухо

    Spritz 30 сентября 2008 г. 4:08, спустя 8 минут 57 секунд

    Делегированный метод


    class A {
    public function myMethodA(){
    echo "A!";
    }
    }

    class B{
    private $a;
    public function __construct($a){
    $this->a = $a
    }
    public function myMethodB(){
    $this->a->myMethodA();
    }
    }

    $b = new B(new A());
    $b->myMethodB(); // A!


    это относиться к примеру от айви
    там надо было чтобы лоадер делегировал метод класса тест
  • Lirck

    Сообщения: 1658 Репутация: N Группа: Джедаи

    Spritz 30 сентября 2008 г. 4:16, спустя 7 минут 28 секунд

    <?php

    error_reporting(E_ALL);

    class Controller
    {
       public $load;

       public function __construct()
       {
           $this->load = new Loader;
       }
    }

    class Loader
    {
       public function component($string)
       {
           include_once strtolower($string) . '.php';
           
           return new $string;
       }
    }

    class Test extends Controller
    {
       public function __construct()
       {
           parent::__construct();
           
           $this->load->component('hello');
       }
    }

    $test = new Test;

    Как мне сделать, чтобы все методы класса hello (он лоадером загружается) были доступны в классе Test таким образом:
    $this->имя_класса->метод

    ???
  • Trej Gun

    Сообщения: 5299 Репутация: N Группа: в ухо

    Spritz 30 сентября 2008 г. 4:32, спустя 16 минут 29 секунд


    class Hello
    {
       public function world(){
            echo "helou wort";
       }
    }

    class Loader
    {
       public static function loadByName($name){
           return new $name;
       }
    }

    class Test
    {
       public $halo;
       public function __construct(){
           $this->halo = Loader::loadByName("Hello");
       }
       public function write(){
           $this->halo->world();
       }
    }

    $t = new Test();
    $t->halo->world();


  • Lirck

    Сообщения: 1658 Репутация: N Группа: Джедаи

    Spritz 30 сентября 2008 г. 4:38, спустя 5 минут 31 секунду

    У меня классы загружаются таким раком — $this->load->component(имя_класса);
    Как сделать, чтобы после загрузки любого класса на него можно было бы ссылаться из класса Test (контроллера короче) таким макаром — $this->имя_класса->метод????
    ))
  • Trej Gun

    Сообщения: 5299 Репутация: N Группа: в ухо

    Spritz 30 сентября 2008 г. 4:48, спустя 9 минут 57 секунд

    aivee, омг
    ты что ZF используешь?

Пожалуйста, авторизуйтесь, чтобы написать комментарий!