更新:问题与编译有关,如果我使用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 上顺利运行