构造函数中的对象初始化(php 5.5)


Object initialization in the constructor (php 5.5)

更新:问题与编译有关,如果我使用disable-all进行编译,那么代码将按预期工作。奇怪的是,只有5.3后版本受到影响。我将多次重新编译最新版本,每次只添加一个--enable-*,以找出问题的原因,然后发布结果。

我正在尝试迁移到php5.5,但找不到绕过这件简单的事情的方法,这件事描述了很多次,但在不同的上下文中。

我得到

"警告:从空值创建默认对象">

我知道解决方法是使用stdObject,但它对我不起作用。看起来我在某个地方犯了错误,请帮帮我。

我制作了以下代码:

class MyClass {
   public $param;
   public function MyClass() {
      $this->param = "Param initialized";
   }
}
$myClass = new MyClass();
echo $myClass->param."'n";

它给了我一条空线。我试图在param初始化之前添加$this = new stdClass();,但它只是隐藏了警告,"param"仍然未初始化。

我还尝试将构造函数定义为__construct,它给出了完全相同的结果。

我所需要的只是一个简单的对象构造函数示例,它可以初始化正在初始化的对象的任何属性。

有什么想法吗?

更新:伙计们,这才是真正的密码。首先,5.3的理想行为:

-bash-4.1$ cat tc.php
<?
    class MyClass {
        public $param;
        public function MyClass() {
          echo "in Constructor'n";
          $this->param = "Param initialized";
        }
        public function getParam() {
          echo "in getParam'n";
          return $this->param;
        }
    }
    $myClass = new MyClass();
    echo "1: ".$myClass->param."'n";
    echo "2: ".$myClass->getParam()."'n";
    ?>
-bash-4.1$ ../php-5.3.29/sapi/cli/php tc.php
 in Constructor
 1: Param initialized
 in getParam
 2: Param initialized
 -bash-4.1$

现在与5.5相同的代码(与5.6相同(:

 -bash-4.1$ ../php-5.5.30/sapi/cli/php tc.php
  in Constructor
  Warning: Creating default object from empty value in tc.php on line 9
  1:
  in getParam
  2:

现在更正代码以避免警告:

-bash-4.1$ cat /export/home/csweb/CS/Activiti-Decta/CScripter/tc.php
 <?
  class MyClass {
     public $param;
     public function MyClass() {
       echo "in Constructor'n";
       $this = new stdClass();
       $this->param = "Param initialized";
     }
     public function getParam() {
       echo "in getParam'n";
       return $this->param;
     }
  }
  $myClass = new MyClass();
  echo "1: ".$myClass->param."'n";
  echo "2: ".$myClass->getParam()."'n";
  ?>
-bash-4.1$ ../php-5.5.30/sapi/cli/php tc.php
 in Constructor
 1:
 in getParam
 2:

为了完整起见,php 5.6

-bash-4.1$ ../php-5.6.14/bin/php tc.php
 in Constructor
 1:
 in getParam
 2:

有什么建议可以得到与5.3和5.5或5.6相同的结果吗?

问题是由php编译过程中传递的错误EXTRA_CFLAGS引起的。这是一个有效的:

export CPPFLAGS="-m64"; 
export EXTRA_CFLAGS="-m64";
make clean;
./configure --disable-all --disable-cgi --with-openssl --enable-json --with-oci8=instantclient,instantclient64_12_1/
make

还有一个产生php二进制文件的行为非常奇怪:

EXTRA_CFLAGS="-D_XPG4_2 -D__lint -m64 -DSIOCGIFNAME"

为什么CFLAGS添加了这么多东西?因为我试图与套接字兼容,这会产生编译错误,所以我试图向gcc展示这一方法。PHP编译成功,测试没有任何问题。

没有时间或欲望继续挖掘,我现在很高兴系统在5.6 上顺利运行