首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ZF2使用PHP5与PHP7

ZF2使用PHP5与PHP7
EN

Stack Overflow用户
提问于 2016-11-30 21:38:17
回答 3查看 2.9K关注 0票数 2

我的自定义类在以下位置有问题:

代码语言:javascript
复制
module/SomeModule/src/SomeModule/Model/someClass.php

我使用ServiceLocator (与教程完全相同)获得这样的数据库适配器:

代码语言:javascript
复制
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。并给出了这个错误:

代码语言:javascript
复制
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之间有这种区别,以及如何解决它?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 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之前,这样的调用已经触发了严格的通知。

票数 3
EN

Stack Overflow用户

发布于 2016-12-01 08:21:53

这个问题可能是因为Zend的后期版本中的ServiceLocatorAwareInterfaceServiceManagerAwareInterface被删除了。这也意味着默认情况下,ServiceLocatorServiceLocatorAware类中不再可用。

因此,在您的问题中,本教程中的这一行指的是:

然后,可以在任何ServiceLocatorAware类中访问适配器。

不再适用于较新的Zend Framework版本(PHP 7版本)。

您还可以在迁移指南中阅读有关此更改的更多信息。

删除了下列接口、特征和类:

  • ..。
  • Zend\ServiceManager\ServiceLocatorAwareInterface
  • Zend\ServiceManager\ServiceLocatorAwareTrait
  • Zend\ServiceManager\ServiceManagerAwareInterface

ServiceLocatorAware和ServiceManagerAware接口和特征在v2下经常被滥用,它们代表了ServiceManagerAware组件的目的的对立面;依赖关系应该直接注入,容器不应该由对象组成。

您将需要重构您的服务,最好的方法可能是创建一个服务工厂,在这里注入依赖项(在您的示例中是Zend\Db\Adapter\Adapter类)。

票数 1
EN

Stack Overflow用户

发布于 2016-12-01 10:27:05

在你的评论之后,我明白了问题的所在。这个信息应该是在问题中,也许你可以编辑你的问题并添加它。

您可以静态地调用getAdapter (User::getAdapter();),但是当您这样做时,$this将不可用.

您可以在PHP中静态地调用非静态方法,但是如果方法使用$this,则会引发错误,因为静态调用该方法时$this不可用。

有关更多信息,请访问还有这个类似的问题还有一个答案

您可以这样做,但是如果在名为$this的函数中使用fun1(),则代码将出错。

关于为什么使用PHP5.6而不再使用它,我想参考@DanFromGermany的答案,他很好地解释了这一点.

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40898707

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档