我的自定义类在以下位置有问题:
module/SomeModule/src/SomeModule/Model/someClass.php我使用ServiceLocator (与教程完全相同)获得这样的数据库适配器:
public function getAdapter()
{
if (!$this->adapter) {
$sm = $this->getServiceLocator();
$this->adapter = $sm->get('Zend\Db\Adapter\Adapter');
}
return $this->adapter;
}在PHP 5中,它工作得很好,但是在PHP7中却不工作。看起来这个类在PHP7中不再是ServiceLocatorAware。并给出了这个错误:
Fatal error: Uncaught Error: Using $this when not in object context in C:\Zend9\Apache24\htdocs\Project\module\Account\src\Account\Model\User.php:316
Stack trace:
#0 C:\Zend9\Apache24\htdocs\Project\module\Account\src\Account\Model\User.php(271): Account\Model\User::getAdapter()
#1 C:\Zend9\Apache24\htdocs\Project\module\Account\src\Account\Controller\LoginController.php(40): Account\Model\User::userLogin('xxx', 'xxx')
#2 C:\Zend9\ZendServer\data\libraries\Zend_Framework_2\2.4.9\library\Zend\Mvc\Controller\AbstractActionController.php(82): Account\Controller\LoginController->indexAction()
#3 [internal function]: Zend\Mvc\Controller\AbstractActionController->onDispatch(Object(Zend\Mvc\MvcEvent))
#4 C:\Zend9\ZendServer\data\libraries\Zend_Framework_2\2.4.9\library\Zend\EventManager\EventManager.php(444): call_user_func(Array, Object(Zend\Mvc\MvcEvent))
#5 C:\Zend9\ZendServer\data\libraries\Zend_Framework_2\2.4.9\library\Zend\EventManager\EventManager.php(205): Zend\EventManager\EventManager->trigg
in C:\Zend9\Apache24\htdocs\Project\module\Account\src\Account\Model\User.php on line 316任何人都可以告诉我,为什么PHP 5和PHP 7之间有这种区别,以及如何解决它?
发布于 2016-12-01 08:47:19
您或Zend使用$this调用静态成员(类似于使用静态调用调用非静态成员)。
如果您没有删除一半的错误消息,我可以告诉您这是在哪里发生的。
来自http://php.net/manual/en/language.oop5.basic.php
当从对象上下文中调用方法时,伪变量
$this是可用的。$this是对调用对象的引用(通常是方法所属的对象,但如果方法是从次要对象的上下文静态调用的,则可能是另一个对象)。从PHP7.0.0开始静态地从不兼容的上下文调用非静态方法,导致$this在方法中未定义,而从不兼容上下文静态调用非静态方法的在PHP5.6.0中已被取消。从PHP 7.0.0开始,静态地调用一个非静态方法通常已经被废弃(即使是从兼容的上下文中调用)。在PHP5.6.0之前,这样的调用已经触发了严格的通知。
发布于 2016-12-01 08:21:53
这个问题可能是因为Zend的后期版本中的ServiceLocatorAwareInterface和ServiceManagerAwareInterface被删除了。这也意味着默认情况下,ServiceLocator在ServiceLocatorAware类中不再可用。
因此,在您的问题中,本教程中的这一行指的是:
然后,可以在任何ServiceLocatorAware类中访问适配器。
不再适用于较新的Zend Framework版本(PHP 7版本)。
您还可以在迁移指南中阅读有关此更改的更多信息。
删除了下列接口、特征和类:
ServiceLocatorAware和ServiceManagerAware接口和特征在v2下经常被滥用,它们代表了ServiceManagerAware组件的目的的对立面;依赖关系应该直接注入,容器不应该由对象组成。
您将需要重构您的服务,最好的方法可能是创建一个服务工厂,在这里注入依赖项(在您的示例中是Zend\Db\Adapter\Adapter类)。
发布于 2016-12-01 10:27:05
在你的评论之后,我明白了问题的所在。这个信息应该是在问题中,也许你可以编辑你的问题并添加它。
您可以静态地调用getAdapter (User::getAdapter();),但是当您这样做时,$this将不可用.
您可以在PHP中静态地调用非静态方法,但是如果方法使用$this,则会引发错误,因为静态调用该方法时$this不可用。
有关更多信息,请访问还有这个类似的问题还有一个答案:
您可以这样做,但是如果在名为$this的函数中使用
fun1(),则代码将出错。
关于为什么使用PHP5.6而不再使用它,我想参考@DanFromGermany的答案,他很好地解释了这一点.
https://stackoverflow.com/questions/40898707
复制相似问题