2

次の場所にあるカスタム クラスに問題があります。

module/SomeModule/src/SomeModule/Model/someClass.php

を使用して、このようなデータベース アダプターを取得します(このLearning Zend Framework 2チュートリアルServiceLocatorとまったく同じです)。

public function getAdapter()
{
  if (!$this->adapter) {
    $sm = $this->getServiceLocator();
    $this->adapter = $sm->get('Zend\Db\Adapter\Adapter');
  }
  return $this->adapter;
}

PHP 5 では問題なく動作しますが、PHP 7 では動作しません。ServiceLocatorAwareクラスはPHP 7ではなくなったようです。そして、次のエラーが発生します:

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 にこのような違いがある理由と、その解決方法を教えてください。

4

3 に答える 3

1

あなたのコメントの後、私は問題が何であるかがわかります。この情報は質問に含まれているはずです。質問を編集して追加することもできます。

getAdapter静的に呼び出すことはできますが( User::getAdapter();)、$thisこれを行うと利用できなくなります...

PHP で非静的メソッドを静的に呼び出すことはできますが、メソッドを静的に呼び出すときに使用できない$thisため、メソッドが使用するとエラーがスローされ$thisます。

詳細については、この同様の質問と回答も確認してください。

これを行うことはできますが、呼び出された関数で $this を使用すると、コードでエラーが発生しますfun1()

これがPHP 5.6で機能していた理由について、これをうまく説明している@DanFromGermanyからの回答を参照したいと思います...

于 2016-12-01T10:27:05.580 に答える