gpt4 book ai didi

反序列化后PHP类公共(public)变量未定义

转载 作者:可可西里 更新时间:2023-11-01 13:24:10 24 4
gpt4 key购买 nike

所以在某个时候,ajax 调用会发送一个 JSON,我将其转换为对象并存储在 session 中:

    if ( $deps = json_decode( $raw_json, true ) )
{
$pkgs = array();

foreach ( $deps['vector'] as $key )
{
if ( strcasecmp( $key['package'], $key['component'] ) == 0 )
{
$package = new Package();
$package->name = $key['package'];
$package->version = $key['version'];
$package->cxx_include = $key['cxx_inc'];
$package->cxx_link = $key['cxx_link'];
$pkgs[] = $package;
}
else
{
foreach( $pkgs as $package )
{
if ( $package->name == $key['package'] )
{
$component = new Component();
$component->name = $key['component'];
$component->cxx_link = $key['cxx_link'];
$package->components[] = $component;
}
}
}
}

$_SESSION['pkgs'] = serialize( $pkgs );

实际的类很简单:

class Component
{
public $name;
public $cxx_link;
}

class Package
{
public $name;
public $version;
public $cxx_inclue;
public $cxx_link;
public $components = array();
}

稍后,我反序列化并尝试解析它们:

    $pkgs = isset( $_SESSION['pkgs'] ) ? unserialize($_SESSION['pkgs']) : array();

foreach ( $pkgs as $package )
{
fwrite( $cmake, "find_package(" . $package->name . " " . $package->version . " " );
if ( count( $package->components ) > 0 )
{
fwrite( $cmake, "COMPONENTS " );
foreach ( $package->components as $component )
fwrite( $cmake, $component->name. " " );

fwrite( $cmake, "REQUIRED )\r\n" );
}

if ( isset( $package->cxx_include ) )
// ERROR here: undefined variable
fwrite( $cmake, "include_directories(${".$package->cxx_include."})\r\n" );

if ( isset( $package->cxx_link ) )
// ERROR here: undefined variable
fwrite( $cmake, "target_link_libraries($rapp_name ${".$package->cxx_link."})\r\n" );
foreach ( $package->components as $component )
{
if ( isset($component->cxx_link) )
// ERROR here: undefined variable
fwrite( $cmake, "target_link_libraries($rapp_name ${".$component->cxx_link."})\r\n" );
}
}

真正让我困惑的不是 undefined variable 是 $component->cxx_link 或 $package->cxx_link,而是我看到的是来自 JSON 的实际值。

例如,如果 JSON 是:

{
"vector": [
{
"package": "Boost",
"version": "1.54",
"component": "Boost",
"cxx_inc": "Boost_INCLUDE_DIRS",
"cxx_link": "Boost_LIBRARIES"
},
{
"package": "Boost",
"version": "1.54",
"component": "date_time",
"cxx_inc": "",
"cxx_link": "Boost_DATE_TIME_LIBRARY"
},
{
"package": "Boost",
"version": "1.54",
"component": "filesystem",
"cxx_inc": "",
"cxx_link": "Boost_FILESYSTEM_LIBRARY"
},
{
"package": "Opencv",
"version": "3.0",
"component": "OpenCV",
"cxx_inc": "OpenCV_INCLUDE_DIRS",
"cxx_link": "OpenCV_LIBS"
},
{
"package": "Eigen3",
"version": "3.0",
"component": "Eigen3",
"cxx_inc": "EIGEN3_INCLUDE_DIR",
"cxx_link": ""
}
]
}

我收到错误:

PHP Notice:  Undefined variable: .Boost_INCLUDE_DIRS.
PHP Notice: Undefined variable: .Boost_LIBRARIES.
PHP Notice: Undefined variable: .OpenCV_INCLUDE_DIRS.

哪些是我为类成员设置的值。如果我理解正确的话,JSON 迭代期间的赋值操作会进行某种浅拷贝吗?

编辑 根据 Barmar 的评论,我删除了序列化/反序列化,并将类定义移动到每个使用这些类的文件的顶部。我不再收到自动加载错误,但我仍然收到完全相同的 undefined variable 错误。

最佳答案

更正:

所以问题是您使用双引号而不是单引号作为字符串。 PHP 有一个叫做可变变量的东西,你会无意中使用它(参见 http://php.net/manual/en/language.variables.variable.php )。

将包含 "${something}" 之类内容的每个字符串切换为单引号(或像 Alex 提到的那样转义美元符号),你会没事的,即:

fwrite( $cmake, "include_directories(${".$package->cxx_include."})\r\n");

会是

fwrite( $cmake, 'include_directories(${'.$package->cxx_include.'})'."\r\n");

(请注意,您不能在单引号字符串中使用 \r\n。)

旧答案:

您的 Package 类中有错字。

您将其分配给 $package->cxx_include 但实际名称缺少“d”。

class Package
{
public $name;
public $version;
public $cxx_inclue; // typo
public $cxx_link;
public $components = array();
}

关于反序列化后PHP类公共(public)变量未定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30314686/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com