【问题标题】:PhP Namespaces in input types输入类型中的 PhP 命名空间
【发布时间】:2014-07-22 14:23:24
【问题描述】:

我在我们的开发环境中有以下奇怪之处。假设我有 2 节课 一个在命名空间\wtf

namespace \wtf\isWrongHere;

class DrStrange {

}

我还有一个类,我通过依赖注入传递该类

 namespace \normalPpl;


     class ThisHasNoLogic {
       public function __construct(DrStrange $strange){ 
           //here be dragons
       }
     }

现在当我通过以下方式实例化课程时:

$whata = new ThisHasNoLogic(new \wtf\isWrongHere\DrStrange());

在我的 debian 开发机器上,我得到了正常的实例,在我们的开发机器(我们的实时服务器的克隆)上,我得到了正常的结果。

但是在我们的实时机器上,我遇到了一个致命错误。这怎么可能?

PHP Catchable fatal error: Argument 2 passed to xxxx must be an instance of xxxxx, instance of aaaaar given, called in ....QQ

在所有服务器中,它都接受输入类型,但在现场它告诉我传递的类与所需的不匹配...

又名 \wtf\isWrongHere\DrStrange 不是 DrStrange 的实例,这对我来说只是普通的 WTH@12 时刻。

以下是规格:

开发机器:

带有 Suhosin-Patch (cli) 的 PHP 5.3.3-7+squeeze14(构建时间:2012 年 8 月 6 日 14:18:06) 版权所有 (c) 1997-2009 The PHP Group Zend Engine v2.3.0, 版权所有 (c) 1998-2010 Zend Technologies 使用 Xdebug v2.2.5,版权所有 (c) 2002-2014,作者 Derick Rethans 与 Suhosin v0.9.32.1,版权所有 (c) 2007-2010,SektionEins GmbH

Server version: Apache/2.2.16 (Debian)
Server built:   Apr  1 2012 07:14:38
Server's Module Magic Number: 20051115:24
Server loaded:  APR 1.4.2, APR-Util 1.3.9
Compiled using: APR 1.4.2, APR-Util 1.3.9
Architecture:   64-bit
Server MPM:     Prefork
  threaded:     no
    forked:     yes (variable process count)
Server compiled with....
 -D APACHE_MPM_DIR="server/mpm/prefork"
 -D APR_HAS_SENDFILE
 -D APR_HAS_MMAP
 -D APR_HAVE_IPV6 (IPv4-mapped addresses enabled)
 -D APR_USE_SYSVSEM_SERIALIZE
 -D APR_USE_PTHREAD_SERIALIZE
 -D SINGLE_LISTEN_UNSERIALIZED_ACCEPT
 -D APR_HAS_OTHER_CHILD
 -D AP_HAVE_RELIABLE_PIPED_LOGS
 -D DYNAMIC_MODULE_LIMIT=128
 -D HTTPD_ROOT="/etc/apache2"
 -D SUEXEC_BIN="/usr/lib/apache2/suexec"
 -D DEFAULT_PIDLOG="/var/run/apache2.pid"
 -D DEFAULT_SCOREBOARD="logs/apache_runtime_status"
 -D DEFAULT_LOCKFILE="/var/run/apache2/accept.lock"
 -D DEFAULT_ERRORLOG="logs/error_log"
 -D AP_TYPES_CONFIG_FILE="mime.types"
 -D SERVER_CONFIG_FILE="apache2.conf"

测试机:

PHP 5.3.3-7+squeeze15 with Suhosin-Patch (cli) (built: Mar  4 2013 13:11:17)
Copyright (c) 1997-2009 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2010 Zend Technologies
    with Suhosin v0.9.32.1, Copyright (c) 2007-2010, by SektionEins GmbH

Server version: Apache/2.2.16 (Debian)
Server built:   Mar  3 2013 12:09:44

直播:

PHP 5.3.3-7+squeeze15 with Suhosin-Patch (cli) (built: Mar  4 2013 13:11:17)
Copyright (c) 1997-2009 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2010 Zend Technologies
    with Suhosin v0.9.32.1, Copyright (c) 2007-2010, by SektionEins GmbH



Server version: Apache/2.2.16 (Debian)
Server built:   Mar  3 2013 12:09:44

我不知道如何使测试服务器表现得像 Live。有人有什么建议吗??

更新:

当我使用时:

使用 \wtf\isWrongHere\DrStrange;

它有效。但是我无法在忽略此错误的测试系统上重现它。我想在不同的机器上复制它。这是我的实际问题,困扰我的团队超过 1 年。

【问题讨论】:

  • 这是伪代码。将纠正它。 (更新:完成了:D)

标签: php zend-framework io namespaces


【解决方案1】:

你必须给 DrStrange 命名空间让它工作。

namespace \normalPpl;

use wtf\isWrongHere\DrStrange;

 class ThisHasNoLogic {
   public function __constructor(DrStrange $strange){ 
       //here be dragons
   }
 }

假设你有一个很好的自动加载(见psr-4php spl_autoload

【讨论】:

  • Aaa 忘了告诉它。已经这样做了,这解决了问题。实际问题是我无法测试我的代码并想在我的测试机器上复制它(将更新问题)
  • 这个问题,无法测试总是困扰着我们,导致无法测试的错误发生,每两个月给我们一个可怕的恐惧。
  • 你有没有看过我的最后一句话并研究了自动加载解决方案。这是一个最佳实践。
  • 是的,我做到了。如前所述,我们知道使用命名空间的解决方案,问题是相同的代码在我们的开发和测试服务器上工作,但在我们的实时服务器上不工作。我怀疑在 PHP 中设置了一些不同的东西,但不知道是什么。
  • 你试过Composer autoloading吗?
猜你喜欢
  • 2012-01-08
  • 1970-01-01
  • 2022-12-31
  • 2011-08-16
  • 2014-08-12
  • 2013-12-28
  • 1970-01-01
  • 2016-03-25
  • 1970-01-01
相关资源
最近更新 更多