代码之家  ›  专栏  ›  技术社区  ›  step

如何在返回类的父级调用函数?

php
  •  1
  • step  · 技术社区  · 7 年前

    class Main {
    
        protected $setting;
    
        public function __construct($setting = false)
        {
            $this->setting;
        }
    
        public function call($param)
        {
            //do some stuff
            //$this->setting
        }
    
        public function groupA()
        {
            return new GroupA();
        }
    }
    
    class GroupA {
    
        public function methodA()
        {
            //how to call call('method') at Main function
        }
    }
    
    $obj = new Main();
    $obj->groupA()->methodA();
    

    如何访问此功能?

    4 回复  |  直到 7 年前
        1
  •  1
  •   Szymon Dudziak    7 年前

    通过构造函数将主类注入GroupA类。别忘了你只能在那里使用公共方法。

    composition design pattern

    class Main
    {
        ...
    
        public function groupA() : GroupA
        {
            return new GroupA($this);
        }
    }
    
    class GroupA
    {
        /** @var Main */
        private $main;
    
        ...
    
        public function __construct(Main $main) {
            $this->main = $main;
        }
    
        ...
    
        public function methodA($params) : void
        {
            return $this->main->call($param) ;
        }
    }
    
    // usage
    $obj = new Main();
    $obj->groupA()->methodA($params);
    
        2
  •  0
  •   Manish Dhruw    7 年前
    class Main
    {
        protected $setting;
    
        public function __construct($setting = false)
        {
            $this->setting;
        }
    
        public function call($param)
        {
            //do some stuff
            //$this->setting
        }
    
        public function groupA()
        {
            //Intantiating And passing intance on main using setter in GroupA
            return (new GroupA())->setMain($this);
        }
    }
    
    class GroupA
    {
    
        private $_main;
    
        public function setMain( $main )
        {
            $this->_main = $main;
            return $this ;
        }
    
        public function methodA( $params = [] )
        {
            return $this->_main->call($params) ;
        }
    }
    
    $obj = new Main();
    $obj->groupA()->methodA($params);
    

        3
  •  0
  •   Szymon Dudziak    7 年前

    @步骤

    但现在你要做的是:

    class GroupA
    {
        private $requiredPrivateMethod;
    
        public function __construct(callable $requiredPrivateMethod)
        {
            $this->requiredPrivateMethod = $requiredPrivateMethod;
        }
    
        public function call(...$params) : void
        {
            \call_user_func($this->requiredPrivateMethod, ...$params);
        }
    }
    
    class Main
    {
        private function methodC() : void
        {
            echo 'called private methodC';
        }
    
        public function groupA()
        {
            $that = $this;
            return new GroupA(function() use ($that) {
                $that->methodC();
            });
        }
    }
    
    $main = new Main();
    // call private method Main::methodC from GroupA::call
    $main->groupA()->call();
    
        4
  •  0
  •   step    7 年前

    class Main
    {
        public function call($params)
        {
            //some stuff
        }
    
        public function SubMain()
        {
            return new SubMain($this);
        }
    }
    
    class SubMain extends Base
    {
        public function ClassA()
        {
            return new ClassA($this->parent);
        }
    }
    
    class Base
    {
        protected $parent;
    
        public function __construct($parent)
        {
            $this->parent = $parent;
        }
    
    }
    class ClassA extends Base
    {
        public function FunctionA($params)
        {
            return $this->parent->call($params);
        }
    
    }
    $iw = new Main();
    $result = $iw->SubMain()->ClassA()->FunctionA($params);
    

    推荐文章