【问题标题】:php overload = operator [duplicate]php重载=运算符[重复]
【发布时间】:2011-11-12 05:46:49
【问题描述】:

可能重复:
Operator Overloading in PHP

有没有办法重载 = 运算符?

所以想要我如下:

class b{
    function overloadis(){
       // do somethng
    }
}

$a = new b();
$a = 'c';

在上面的例子中,我希望当 $a = 'c';被调用时,首先调用方法重载is,然后该函数决定动作(将'c'分配给$a)是否执行或中止。

这样可以吗?

提前谢谢, 鲍勃

【问题讨论】:

  • 不,那篇文章是关于一个数组的。我找不到普通变量的答案,而不是数组。
  • 我觉得这是一种错误的懒惰。

标签: php oop operator-overloading overloading


【解决方案1】:

没有。 PHP 不支持运算符重载,但有一些例外(如 @NikiC 所述:“PHP 支持某些运算符的重载,例如 []、-> 和 (string),还允许重载某些语言结构,例如 foreach”)。

【讨论】:

  • (有一个 PECL 扩展,但它与不存在一样好 - 自 2006 以来它没有看到任何发展,并且从未退出测试版)跨度>
  • -1 表示“一点也不”。 PHP 支持重载一些运算符,如[]->(string),还允许重载一些语言结构,如foreach
  • @NikiC:哇。我从来没有见过[],无论是提到还是在野外 - 关心链接到一个例子?我真的很好奇。
  • ArrayAccess 接口允许您为数组 set/get/push/isset/unset 指定自定义操作:php.net/manual/en/class.arrayaccess.php
  • [不寒而栗] PHP 真正具备厨房水槽的一切。
【解决方案2】:

您可以通过使用PHP-magic-function __set() 并将相应的属性设置为私有/受保护来模仿类属性的此类功能。

class MyClass
{
    private $a;

    public function __set($classProperty, $value)
    {
        if($classProperty == 'a')
        {
            // your overloadis()-logic here, e.g.
            // if($value instanceof SomeOtherClass)
            //     $this->$classProperty = $value;
        }
    }
}

$myClassInstance = new MyClass();
$myClassInstance->a = new SomeOtherClass();
$myClassInstance->a = 'c';

【讨论】:

    【解决方案3】:

    看看PECL Operator overloading 扩展。

    【讨论】:

    • 虽然,正如 Piskvor 上面所说,它是古老的、不受欢迎的,而且不会太有用。
    • 此时,2013年发布了两个测试版,检查一下;)
    • 无法让它与我在 Windows 7 上的本地 64 位 Wamp 一起工作。
    • 那么可能需要适应 64 位代码。
    猜你喜欢
    • 2012-12-11
    • 2013-04-03
    • 2014-02-25
    • 2015-06-20
    • 2011-10-27
    • 2010-09-19
    • 2012-12-22
    相关资源
    最近更新 更多