刚用tp5做一个项目,需要跨模块使用另一个模块里的控制器的操作,一时没有反应过来,于是到本论坛搜一搜方法,结果翻了翻手册,发现了一个action助手函数,于是便用了。
经过
我是这么用的:
$name=action("模块/控制器/操作");当我满怀希望地一运行时,结果报了个错:Trying to invoke protected method app\member\controller\Account::xxx() from scope ReflectionMethod我一看,愣了。发展
居然错了,原来是我另一个模块里的操作前加了protected,是一个被保护的操作,事情到了这个地步。我只有两个选择,要么将其修改为public方法,但是不行,不安全,要么找另一个方法。
高潮
我在仔细地看着这个操作,猛然间才明白过来,其实不管是现在的tp5,还是之前的tp3,或者未来的tp6、7、8、9等等,要知道,所有的模块具体到实际就是一个个控制器,而控制器实际上就是一个类,既然是一个类,那么必然可以被继承或被实例化。而调用控制器里的一个方法,实际上则是调用某个类的一个函数。在类中函数有三种,一是public,二是protected,三是private。所以,调用另一个控制器里的方法,要么继承控制器通过
$this->xxx()来调用,要么实例化控制器使用A=new A;$a=A->xxx()来调用。我选择了实例化,结果,终于还是不行。因为protected方法只能在父类,本类以及子类中调用。所以,最后我选择了继承它,即使用
class Create extends Account,Create 是当前控制器,Account是目标控制器,任务成功完成。结局事情到此,就算结束了。但是我总结出一个经验,不管是使用什么框架,内部如何称呼,组织不要被其表面所蒙蔽,要明白它的本质,不过是以一个类,数组,组成的,而它们,是php语言。那么,所有一切能通过框架完成的,php都能完成。框架只是将这个过程简单化了,组织得更有效率。所以,多学学基础知识是有好处得。正所谓:万丈高楼平地起
最佳答案