有没有办法告诉php编译器我想要从一种类型到另一种类型的特定隐式转换?
一个简单的例子:
class Integer
{
public $val;
}
function ExampleFunc(Interger $i){...}
ExamFunc(333); // 333 -> Integer object with $val == 333.
[edit] …有人要求举一个例子.这是来自c#的示例.这是一种布尔类型,在访问一次后会更改值.
/// <summary>
/// A Heisenberg style boolean that changes after it has been read. Defaults to false.
/// </summary>
public class hbool
{
private bool value;
private bool changed = false;
public hbool()
{
value = false;
}
public hbool(bool value)
{
this.value = value;
}
public static implicit operator bool(hbool item)
{
return item.Value;
}
public static implicit operator hbool(bool item)
{
return new hbool(item);
}
public bool Value
{
get
{
if (!changed)
{
value = !value;
changed = true;
return !value;
}
return value;
}
}
public void TouchValue()
{
bool value1 = Value;
}
public static hbool False
{
get { return new hbool(); }
}
public static hbool True
{
get { return new hbool(true); }
}
}
[Test]
public void hboolShouldChangeAfterRead()
{
hbool b = false;
Assert.IsFalse(b);
Assert.IsTrue(b);
Assert.IsTrue(b);
hbool b1 = false;
Assert.IsFalse(b1);
Assert.IsTrue(b1);
Assert.IsTrue(b1);
hbool b2 = true;
Assert.IsTrue(b2);
Assert.IsFalse(b2);
Assert.IsFalse(b2);
bool b3 = new hbool();
Assert.IsFalse(b3);
Assert.IsFalse(b3);
Assert.IsFalse(b3);
}
解决方法:
长答案:
我认为在这种情况下,PHP很难进行隐式转换.
请记住:您将类称为Integer的事实对代码的读者来说是一个提示,PHP不理解它实际上是用于保存整数的.此外,它具有名为$val的属性的事实也向人类读者暗示了它可能应该包含整数的值.同样,PHP不理解您的代码,仅执行它.
在代码的某些时候,您应该进行显式转换. PHP可能为此提供了一些不错的语法糖,但是第一次尝试将是这样的:
class Integer
{
public $val;
function __construct($val) { $this->val = $val; }
}
function ExampleFunc($i){
if (is_numeric($i)) { $iObj = new Integer($i); }
...
}
ExamFunc(333); // 333 -> Integer object with $val === 333.
这并不像您想要的那样酷,但是同样,PHP可能具有一些语法糖,它将或多或少地隐藏显式转换.
简洁版本:
无论哪种方式,您都需要进行显式转换