Перегрузка метода поддержки php. Пробовав код ниже, он предполагает, что он поддерживает перегрузку метода. Любые виды
class test { public test($data1) { echo $data1; } } class test1 extends test { public test($data1,$data2) { echo $data1.' '.$data2; } } $obj = new test1(); $obj->test('hello','world');
Поскольку я перегружаю метод, он дает результат как «привет мир». Над фрагментом кода предлагается, что php поддерживает перегрузку метода. Поэтому мой вопрос заключается в перегрузке метода поддержки php.
Вы должны сделать разницу между переопределением метода (ваш пример) и перегрузкой метода
Вот простой пример того, как реализовать перегрузку метода в PHP с помощью метода __call magic:
class test{ public function __call($name, $arguments) { if ($name === 'test'){ if(count($arguments) === 1 ){ return $this->test1($arguments[0]); } if(count($arguments) === 2){ return $this->test2($arguments[0], $arguments[1]); } } } private function test1($data1) { echo $data1; } private function test2($data1,$data2) { echo $data1.' '.$data2; } } $test = new test(); $test->test('one argument'); //echoes "one argument" $test->test('two','arguments'); //echoes "two arguments"
Поэтому мой вопрос заключается в том, что перегрузка функции поддержки php (?).
Да, но не так, и в вашем примере это не предполагает, что такая перегрузка правильная, по крайней мере, с версией 5.5.3 и error_reporting(E_ALL)
.
В этой версии, когда вы пытаетесь запустить этот код, он дает вам следующие сообщения:
Strict Standards: Declaration of test1::test() should be compatible with test::test($data1) in /opt/lampp/htdocs/teste/index.php on line 16 Warning: Missing argument 1 for test::test(), called in /opt/lampp/htdocs/teste/index.php on line 18 and defined in /opt/lampp/htdocs/teste/index.php on line 4 Notice: Undefined variable: data1 in /opt/lampp/htdocs/teste/index.php on line 6 hello world //it works, but the messages above suggests that it's wrong.
В обоих случаях вы забыли добавить «функцию» перед тестированием. Метод называется дочерним классом, потому что, когда вы вызываете метод из объекта дочернего класса, сначала проверяйте, существует ли этот метод в дочернем классе, если нет, то он смотрит на унаследованный родительский класс с видимостью public или protected check и если метод существует, результат в соответствии с этим.