PHP类的隐式类型转换?

有没有办法告诉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可能具有一些语法糖,它将或多或少地隐藏显式转换.

简洁版本:

无论哪种方式,您都需要进行显式转换

上一篇:python-非整数错误“错误的整数输入语法”?


下一篇:javascript-从TypeScript中的重写接口自动推断类型