1

我保留了我原来的问题,但想指出我的问题的假设是有缺陷的。阅读更新了解更多


我惊讶地发现这在 PHP 中不起作用:

$someObjects = array();

function getInstance( $key )
{
    if ( ! $someObjects[$key] )
       $someObjects[$key] = new Object;

    return $someObjects[$key];
}

getInstance( 'mykey' )->property = 33;

最后一行创建了一个致命错误:

PHP Fatal error:  Can't use function return value in write context

这是我偶尔在 Actionscript 中使用的一种模式,当您需要显式定义一堆对象(例如在配置文件中)并且您想跳过实例化步骤但又不想处理一堆嵌套数组的混乱。

有什么建议么?


更新

这是阅读回复后的那些无聊时刻之一。我的问题错误地认为这getInstance( 'mykey' )->property = 33是致命错误的根本原因。

我的示例代码很草率,并且有两个大问题(糟糕):

  1. 没有global在函数体中声明
  2. 错误地使用! $array[$key]而不是empty($array[$key])

这些问题也在我的项目代码中,但它们似乎不是致命错误的唯一原因,我已经更改了项目代码,现在我无法弄清楚其他因素是什么(?)。无论如何,我得到了理顺。

在下面的建议之后,这是我的目标语法:

class MetaInfo
{
    public $title;
    public $description;
}

/**
 * @param $key string
 * @return MetaInfo
 */
function getMeta( $key )
{
    global $meta;

    if ( empty($meta[$key]) )
        $meta[$key] = new MetaInfo;

    return $meta[$key];
}

getMeta( 'path/to/page' )->title = "Double-check your work before posting";
4

1 回答 1

3

这在 PHP 5.0.0中得到支持,虽然我不知道你是如何让它工作的。$someObjects不会在getInstance(). 这是我测试过的,它有效:

<?php
class Object
{
    public $property;
}

function getInstance( $key )
{
    static $someObjects;
    if ( ! $someObjects[$key] )
       $someObjects[$key] = new Object;

    return $someObjects[$key];
}

echo getInstance( 'mykey' )->property = 33;  // prints 33 as expected
于 2013-01-13T19:11:27.237 回答