模拟在PHP值类型结构类
-
18-09-2019 - |
题
有什么办法来模拟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");
不隶属于 StackOverflow