повторное объявление экземпляра и статической функции


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 не допускает такого повторного объявления. Есть ли какой-нибудь обходной путь?

Author: Rizky Ramadhan, 2011-05-03

2 answers

Есть на самом деле обходной путь для этого с использованием создания волшебного метода, хотя я, скорее всего, никогда бы никогда не сделал бы что-то подобное в производственном коде:

__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');

?>
 7
Author: Demian Brecht, 2011-05-03 01:35:41

Вот как, я думаю, вы должны сделать это вместо этого:

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
 -3
Author: netcoder, 2011-05-03 01:32:54