有什么办法来模拟PHP中的结构类?即一类经过值,而不是通过引用,所以它仍可以是类型暗示...

如果是的话,可以使用什么不同的技术?什么是最好的技术?

如果这是可能的,你能明显创建PHP完全类型安全层,是有这样几层?有没有人有这样的经验吗?

有帮助吗?

解决方案

对象总是通过引用传递。只有这样,才能让他们通过一个副本是明确使用clone关键字(是的,无处不在)。

我的建议是使用一个数组,这是值类型,因此总是被复制。既然你可以使用它作为一个关联数组(例如字符串 - >值),它也可能是一个对象。不足之处是,当然,你不能使用方法(但是这就像一个结构,所以你可能会很高兴与此)。没有办法执行类型安全,然而

但随着您的所有需求,它听起来就像PHP是不是你的一种语言,是诚实的。

其他提示

我觉得最简单的方法是像Java没有做到这一点 - 有你的价值类是不可变的,让所有的“修改”的方法返回一个新的对象,而不是

我不认为你可以实现这一目标,只能用PHP代码。

您有关于如何PHP函数句柄参数没有控制,我看不出你如何能确保一切都处理你所希望的方式,而无需改变(下级)代码的PHP程序和模块

这将是相当凉,但:)

我玩弄匿名的建议,使物体的任何突变返回一个新的对象,这个工作,但它的尴尬。

<?php
class FruityEnum {
    private $valid = array("apple", "banana", "cantaloupe");
    private $value;

    function __construct($val) {
        if (in_array($val, $this->valid)) {
            $this->value = $val;
        } else {
            throw new Exception("Invalid value");
        }
    }

    function __set($var, $val) {
        throw new Exception("Use set()!!");
    }
    function set(FruityEnum &$obj, $val) {
        $obj = new FruityEnum($val);
    }

    function __get($var) { //everything returns the value...
        return $this->value;
    }
    function __toString() {
        return $this->value;
    }
}

和现在对其进行测试:

function mutate(FruityEnum $obj) { // type hinting!
    $obj->set($obj, 'banana');
    return $obj;
}

$x = new FruityEnum('apple');
echo $x; // "apple"
$y = mutate($x);
echo  $x // still "apple"
    . $y // "banana"

它的工作原理,但你必须用一种奇怪的方式来改变对象:

$obj->set($obj, 'foo');

我能想到这样做会使用__set()方法,但更惨的唯一办法了。你必须要做到这一点,这是血淋淋的混乱。

$obj = $obj->blah = 'foo';

在年底,它可能更容易使私有变量,并提供无存取,所以要改变一个变量的“枚举”价值的唯一方法是创建一个新的:

echo $obj; // "banana"
$obj = new FruityEnum("cantaloupe");
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top