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

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

  • adw0rd

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

    Spritz 30 сентября 2008 г. 19:09, спустя 6 минут 11 секунд

    aivee, http://ru.php.net/manual/ru/language.oop5.overloading.php
    https://smappi.org/ - платформа по созданию API на все случаи жизни
  • Trej Gun

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

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

    он мну азадачил
    я вечером издому отпишу
  • Lirck

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

    Spritz 30 сентября 2008 г. 19:16, спустя 3 минуты 35 секунд

    он мну азадачил
    я вечером издому отпишу

    Было бы неплохо.
  • Lirck

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

    Spritz 30 сентября 2008 г. 19:46, спустя 30 минут 15 секунд

    http://ru.php.net/manual/ru/language.oop5.overloading.php

    Это тут не катит. Сделали же эту фигню разработчики CI, а он для PHP4. В нём нет этих фич.
  • Trej Gun

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

    Spritz 30 сентября 2008 г. 22:33, спустя 2 часа 46 минут 31 секунду

    решил задачку просто



    error_reporting(E_ALL);

    class Hello{
       public function write(){
           echo "hello world";
       }
    }

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

    class Test{
       private $loader;
       public function __construct(){
           $this->loader = new Loader($this);
           $this->loader->load("Hello");
       }
       public function write(){
           $this->Hello->write();
       }
    }

    $t = new Test();
    $t->write();



    тока тут рекурсия получаеться не знаю насколько это хорошо с точки зрения выделения памяти
  • Trej Gun

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

    Spritz 30 сентября 2008 г. 22:47, спустя 14 минут 14 секунд

    ну шо отцы коментируйте
  • adw0rd

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

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

    CTAPbIu_MABP, уверен что это соответствует задаче aivee?

    На сколько я понял он хотел:
    1. Инициализировать объект произвольного класс с помощью класса Loader
    2. Обращаться к методам инициализированного объекта



    $load = new Loader('RunQuery');
    $load->RunQuery->query('select * from `table`');



    Типа того…
    https://smappi.org/ - платформа по созданию API на все случаи жизни
  • Trej Gun

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

    Spritz 30 сентября 2008 г. 23:10, спустя 13 минут 32 секунды

    adw0rd, последний пост на второй странице

    Например, загружаем библиотеку Parser:
    $this->load->library('Parser');

    Теперь вызываем её:
    $this->Parser->parse('текcт');
  • adw0rd

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

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

    CTAPbIu_MABP, а… точно
    https://smappi.org/ - платформа по созданию API на все случаи жизни
  • Patrick

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

    Spritz 1 октября 2008 г. 2:02, спустя 2 часа 28 минут 41 секунду


    ну шо отцы коментируйте

    Как то сложно, вы это не думаете????

    <?php
    class Toolkit
    {
    protected static $instance;

    protected  $signatures;

    private function __construct() {}

    public static  function Instance()
    {
    if(!self::$instance)
    self::$instance = new Toolkit();

    return self::$instance;
    }

    public function SetUp( $tools = null )
    {
    $this->NulledSignatures();
       if ($tools != null) $this->LoadSignatures($tools);
    }

    public function Extend( $tools )
    {
    $this->LoadSignatures($tools);
    }

    protected function LoadSignatures($tools)
    {
           $tools_instance = is_object($tools) ? $tools : new $tools;    
           if(is_a($tools_instance,'iTools'))
           {
               $methods = $tools_instance->getSignatures();
               foreach ($methods as $method)
        $this->signatures[$method] = $tools_instance;
           }else{
               $class_tools = new ReflectionClass($tools);
               $methods = $class_tools->getMethods();
               foreach ($methods as $method)
        {
        if($method->isPublic()) $this->signatures[$method->getName()] = $tools_instance;
        }
           }
    }

    protected function NulledSignatures()
    {
    $this->signatures = array();
    }

    public function __call($func,$args)
    {
           if(isset($this->signatures[$func]))
           {
               return call_user_func_array(array($this->signatures[$func],$func),$args);
           }else{
               throw new Exception('Method ' . $func .' not found in tools ');
           }
    }
    }
    ?>
  • Patrick

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

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

    Ну и тесты для примера

    <?php
    class TestToolkit extends UnitTestCase
    {
    protected $toolkit;

    public function SetUp()
    {
    $this->toolkit = Toolkit::Instance();
    }

    public function TearDown()
    {
    $this->toolkit->SetUp();
    }

    public function TestToolkitInstance()
    {
    $this->assertIdentical($this->toolkit, Toolkit::Instance());
    }

    public function TestSetupObjectWithoutInterfaceITools()
    {
    $this->toolkit->Setup('TstObjectWithOutInterfaceTools');

    $this->MethodWithoutInterfaceTest();
    $this->privateMethodTest();
    }
    public function TestSetupObjectWithInterfaceTools()
    {
    $this->toolkit->Setup('TstObjectWithInterfaceTools');

    $this->assertEqual('TstObjectWithInterfaceTools::TstPublicFunc',$this->toolkit->TstPublicFunc());

    $this->privateMethodTest();

    try{
    $this->toolkit->TstPublicFunc2();
    $this->fail();
    }catch(Exception $e){
    $this->pass();
    }

    }
    public function TestExtendTools()
    {
    $this->toolkit->Extend('TstObjectWithOutInterfaceTools');

    $this->MethodWithoutInterfaceTest();

    $this->toolkit->Extend('TstObjectWithInterfaceTools');

    $this->assertEqual('TstObjectWithInterfaceTools::TstPublicFunc',$this->toolkit->TstPublicFunc());
    $this->assertEqual('TstObjectWithOutInterfaceTools::TstPublicFunc2',$this->toolkit->TstPublicFunc2());
    }

    private function privateMethodTest()
    {
    try{
    $this->toolkit->TstPrivateFunc();
    $this->fail();
    }catch(Exception $e){
    $this->pass();
    }
    }

    private function MethodWithoutInterfaceTest()
    {
    $this->assertEqual('TstObjectWithOutInterfaceTools::TstPublicFunc',$this->toolkit->TstPublicFunc());
    $this->assertEqual('TstObjectWithOutInterfaceTools::TstPublicFunc2',$this->toolkit->TstPublicFunc2());
    }

    }

    class TstObjectWithOutInterfaceTools
    {
    public function TstPublicFunc()
    {
    return __METHOD__;
    }

    public function TstPublicFunc2()
    {
    return __METHOD__;
    }

    private function TstPrivateFunc()
    {
    return __METHOD__;
    }

    }

    class TstObjectWithInterfaceTools implements iTools
    {
    public function getSignatures()
    {
    return array('TstPublicFunc');
    }
    public function TstPublicFunc()
    {
    return __METHOD__;
    }

    public function TstPublicFunc2()
    {
    return __METHOD__;
    }

    private function TstPrivateFunc()
    {
    return __METHOD__;
    }

    }
    ?>
  • Lirck

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

    Spritz 1 октября 2008 г. 9:12, спустя 7 часов 7 минут 14 секунд

    решил задачку просто

    Огромное спасибо! :)
  • Trej Gun

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

    Spritz 1 октября 2008 г. 9:59, спустя 47 минут 38 секунд

    Patrick, да я думаю ты скоипастил очень сложный для понимания кусок
  • Patrick

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

    Spritz 1 октября 2008 г. 18:24, спустя 8 часов 24 минуты 19 секунд

    CTAPbIu_MABP, угу :D только все ваши проблемы он решает ;)
  • Trej Gun

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

    Spritz 1 октября 2008 г. 18:34, спустя 9 минут 59 секунд

    а мне не нравиться решение через синглтон

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