在PHP中访问其他类的函数
我必须在我的Slim 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() {
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
}
}