Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在PHP中访问其他类的函数_Php_Oop_Slim_Slim 3 - Fatal编程技术网

在PHP中访问其他类的函数

在PHP中访问其他类的函数,php,oop,slim,slim-3,Php,Oop,Slim,Slim 3,我必须在我的Slim PHP框架中创建不同的类,名为OrderController&AddressController。我想在OrderController中访问AddressController的一些功能,以减少代码冗余 但我没有办法做到这一点,我知道如何在纯PHP设置中做到这一点,但如何在Slim PHP框架中做到这一点 PHP实现这一点的方法如下: class A { private $xxx; public function __construct() {

我必须在我的Slim PHP框架中创建不同的类,名为
OrderController
&
AddressController
。我想在
OrderController
中访问
AddressController
的一些功能,以减少代码冗余

但我没有办法做到这一点,我知道如何在纯PHP设置中做到这一点,但如何在Slim PHP框架中做到这一点

PHP实现这一点的方法如下:

class A {
    private $xxx;

    public function __construct() {
        $this->xxx = 'Hello';
    }

    public function getXXX() {
        return $this->xxx;
    }
}

class B {
    private $a;

    public function __construct(A $a) {
        $this->a = $a;
    }

    function getXXXOfA() {
        return $this->a->getXXX();
    }
}

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

$b->getXXXOfA();
如何在Slim中实现这种依赖性注射?


注意:如果您的
AddressController
OrderController
具有相同的父类,我将使用Slim PHP v3

,请将这些方法移动到父类:

class AddressContoller extends Controller {
    public function test() {
        $this->methodFromParent();
    }
}
如果不是,则创建该类的新对象并调用方法。方法必须是公共的


如果您的
OrderController
想要从
AccessController
调用方法
foo
,您应该考虑将
foo
移动到其他地方。这是一个很好的错误指示

有两种可能性

  • foo
    属于/与每个控制器相关,并且与控制有关:只需将其移动到父类

  • foo
    只与几个类相关:将它移动到它所属的类。这可能是一个助手类、某个域模型类或其他类。也许你必须引入一个新的类来实现这一点


  • 经过大量的研究,我终于找到了解决办法!将其发布在此处,以便将来任何人都可以从中获得帮助:

    class FirstController 
    {
        protected $container;
        protected $db;
        protected $view;
        protected $second;
    
        // constructor receives container instance
        public function __construct(\Interop\Container\ContainerInterface $container) {
            $this->second = new SecondController($container);
            $this->container = $container;
            $this->db = $this->container->db;
            $this->view = $this->container->view;
        }
    
        public function LocalFunction(){
            $this->second->otherFunction();
            //call the functions in other classes as above
        }
    
    }
    

    想到两个解决方案:

    -1- 你也可以尝试在一个单独的特性中使用公共功能

    -2- 我不会做那件事 新的SecondController($container) 在FirstController的构造函数中,除非每次单击控制器时都需要它。
    我喜欢延迟加载,所以它只会在需要时加载。

    继承:
    类OrderController extends AddressControllerr
    @MASIDDIQUI我不能这样做,这些类没有任何关联,从一个类扩展到另一个类似乎不正确。这是同一级别上的两个类,它们可以共享一些数据。@demonofthemist什么是
    xxx
    ?@Philipp随便你想要什么:),getName,getAge,getTitle等等。这不是AddressController的一部分-它应该属于一个地址模型。我不能将方法移动到其他类。第二个解决方案就像我正在寻找的一样。我也更新了我的问题!如何在Slim中实现这一点?@demonofthemist但您的示例代码正在运行。有什么不对?谢谢,AddressController管理地址、所有地址、单个地址、位置等。所以当我想使用相同的方法时,我想重用它。即使我将其移动到其他类,如何在slim工作结构中访问该类,因此问题也是一样的:(@demonofthemation)您当前在AddressController中使用的是一些或映射器框架还是纯sql语句?带有slim默认$db对象的常规sql,使用PDO进行连接请参阅此链接
    class FirstController 
    {
        protected $container;
        protected $db;
        protected $view;
        protected $second;
    
        // constructor receives container instance
        public function __construct(\Interop\Container\ContainerInterface $container) {
            $this->second = new SecondController($container);
            $this->container = $container;
            $this->db = $this->container->db;
            $this->view = $this->container->view;
        }
    
        public function LocalFunction(){
            $this->second->otherFunction();
            //call the functions in other classes as above
        }
    
    }