【问题标题】:redeclaration of instance and static function实例和静态函数的重新声明
【发布时间】:2011-08-17 08:58:47
【问题描述】:
class me {
   private $name;
   public function __construct($name) { $this->name = $name; }
   public function work() {
       return "You are working as ". $this->name;
   }
   public static function work() {
       return "You are working anonymously"; 
   } 
}

$new = new me();
me::work();

致命错误:无法重新声明我::work()

问题是,为什么 php 不允许像这样重新声明。有什么解决方法吗?

【问题讨论】:

  • 是的,有一个解决方法:使用另一个名称。 ;-) PHP 不是 C++,方法的唯一性在于它们的名称,而不是它们的名称/参数/可见性组合。即使这样,您也不能将对象方法重载为 C++ 中的静态方法。
  • 任何语言都允许这样做吗?我知道 C# 没有 - stackoverflow.com/questions/160118/…
  • 但是用同一个名字做同样的事情是不是很整洁?
  • @Rizky 如果他们做不同的事情就不会
  • @Rizky:不是真的,它只是无缘无故地造成歧义,因为如果两种方法都做同样的事情,你就不需要两者了。只需将构造函数的 $name 参数设为可选参数,然后将 if 放入您的 work() 方法中即可。

标签: php static instance redeclaration


【解决方案1】:

实际上是一种使用魔术方法创建的解决方法,尽管我很可能从不在生产代码中做这样的事情:

__call 在对象范围内调用不可访问的方法时在内部触发。

__callStatic 在静态范围内调用不可访问的方法时在内部触发。

<?php

class Test
{
    public function __call($name, $args)
    {
        echo 'called '.$name.' in object context\n';
    }

    public static function __callStatic($name, $args)
    {
        echo 'called '.$name.' in static context\n';
    }
}

$o = new Test;
$o->doThis('object');

Test::doThis('static');

?>

【讨论】:

  • 无论如何,有什么理由不在生产中使用它吗?
【解决方案2】:

我认为你应该这样做:

class me {
   private $name;

   public function __construct($name = null) { 
       $this->name = $name; 
   }

   public function work() {
       if ($this->name === null) {
           return "You are working anonymously"; 
       }
       return "You are working as ". $this->name;
   }
}

$me = new me();
$me->work(); // anonymous

$me = new me('foo');
$me->work(); // foo

【讨论】:

  • “匿名”不是静态的。
  • @Malfist:它从未声称是。这是一种替代解决方案。下次正确阅读答案。应尽可能避免使用静态方法,并且 OP 的用例不是需要使用静态方法的用例。
  • 为什么要尽量避免使用静态函数?静态函数有很好的理由,加上通过缩小范围来降低复杂性。静态函数是很好的编程。话虽这么说,我同意 OP 的用例不是静态的,但它可能只是 OP 想出的一个示例,以展示他想要的行为。
  • @Malfist:不会与那些说“静态函数是好的编程”之类的人争论(这甚至意味着什么?)。此外,还有很多值得阅读的内容。这并没有改变你完全错过了重点的事实。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-31
  • 2018-07-12
  • 1970-01-01
  • 2013-10-08
  • 1970-01-01
  • 2021-01-05
相关资源
最近更新 更多