Как вызвать статическую дочернюю функцию из родительской статической функции? - PullRequest
8 голосов
/ 13 июля 2011

Как вызвать дочернюю функцию из родительской статической функции?

В php5.3 есть встроенный метод с именем get_called_class() для вызова дочернего метода из родительского класса. Но мой сервер работает с php 5.1 .

Есть ли способ сделать это?

Я хочу вызвать его из статической функции. Так что я не могу использовать "$ this"

Так что я должен использовать ключевое слово "self".

Ниже приведен пример моего родительского класса "Test123", из статической функции родительского класса "myfunc" я пытаюсь вызвать функцию дочернего класса, например "self :: test ();"

abstract class Test123
{

  function __construct()
  {
    // some code here
  }

  public static function myfunc()
  {
    self::test();
  }

  abstract function test();
}

class Test123456 extends Test123
{
  function __construct()
  {
    parent::__construct();
  }

  function test()
  {
    echo "So you managed to call me !!";
  }

}

$fish = new Test123456();
$fish->test();
$fish->myfunc();

Ответы [ 3 ]

12 голосов
/ 13 июля 2011

Редактировать: То, что вы пытаетесь достичь, невозможно с PHP 5.1.В PHP 5.1 нет поздних статических привязок Руководство по PHP , вам нужно явно назвать дочерний класс для вызова дочерней функции: Test123456::test(), self будет Test123 в статической функции класса Test123 (всегда), а ключевое слово static недоступно для вызова статической функции в PHP 5.1.

Связано: новая личность против новой статики ; PHP 5.2 Эквивалент позднего статического связывания (новое статическое)?


Если вы имеете в виду статическую родительскую функцию, вам нужно явно указать имяparent (или child) для вызова функции в php 5.1:

parentClass::func();
Test123456::test();

В PHP 5.3 вы можете сделать это вместо этого с ключевым словом static PHP Manual для разрешения имени вызываемого класса:

static::func();
static::test();

Если они нестатические, просто используйте $this PHP Manual :

$this->parentFunc();
$this->childFunc();

Или, если оно имеет то же имя, используйте parent PHP Manual :

parent::parentFunc();

(это не совсем то, что вы просили, просто поместите его здесь для полноты).

Get_called_class () был введен для очень конкретных случаев, таких как поздние статические привязки Руководство по PHP .

См. Наследование объектов Руководство по PHP

0 голосов
/ 13 июля 2011

попробуйте это:

<?php
 class A {
 public static function newInstance() {
$rv = new static();  
return $rv;
}

public function __construct() { echo " A::__construct\n"; }
}
class B extends A {
public function __construct() { echo " B::__construct\n"; }
} 
class C extends B {
public function __construct() { echo " C::__construct\n"; }   
}
?>
0 голосов
/ 13 июля 2011

Я подозреваю, что вы немного запутались в отношении родителя / ребенка, класса / объекта и функции / метода.

Пусть Г. Стэн объяснил, как вызывать метод, который не объявлен в родительском классе (который, как он говорит, должен быть абстрактным или реализовывать метод __call ()).

Однако, если вы имеете в виду, как вызывать метод, который был переопределен в дочернем классе из родительского, тогда это невозможно - и не должно быть. Рассмотрим:

Class shape {
 ...
}

Class circle extends shape {
  function area() {

  }
} 
Class square extends shape {
  function area() {

  }
}

Если вы намереваетесь вызывать метод области для экземпляра 'shape' (у которого нет метода области), то какой дочерний элемент ему следует использовать? Оба дочерних метода будут зависеть от свойств, которые не являются общими / не реализуются классом формы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...