Virtualfunction 오버로딩 및 다형성 요구를 충족하기 위해 정의가 비어 있더라도 기본 클래스의 함수를 하위 클래스에서 다시 작성할 수도 있고 그렇지 않을 수도 있습니다.
순수 가상 함수는 기본 클래스에 정의되지 않으며 Java의 인터페이스 함수와 마찬가지로 하위 클래스에서 구현되어야 합니다!
가상 함수
도입 이유: 다형성 기능의 사용을 용이하게 하기 위해 기본 클래스에서 가상 함수를 정의해야 하는 경우가 많습니다.
php5에서 이 가상 함수를 어떻게 구현하나요? 아래 코드를 살펴보세요.
<?php class A { public function x() { echo "A::x() was called.\n"; } public function y() { self::x(); echo "A::y() was called.\n"; } public function z() { $this->x(); echo "A::z() was called.\n"; } } class B extends A { public function x() { echo "B::x() was called.\n"; } } $b = new B(); $b->y(); echo "--\n"; $b->z(); ?>
이 예에서 A::y()는 A::x()를 호출하고 B::x()는 A::x()를 재정의한 다음 B가 호출될 때 ::y(), B::y()가 A::x() 또는 B::x()를 호출해야 합니까? C++에서 A::x()가 가상 함수로 정의되지 않은 경우 B::y()(즉, A::y())는 A::x()를 호출하고 A::: x()는 virtual 키워드를 사용하여 가상 함수로 정의되며, B::y()는 B::x()를 호출합니다. 그러나 PHP5에서는 가상 함수의 기능이 self 및 $this 키워드로 구현됩니다. 상위 클래스의 A::y()가 self::x()를 사용하여 A::x()를 호출하면 하위 클래스에서는 A::x()가 재정의되었는지 여부에 관계없이 A::y( ) A::x()를 호출하고 상위 클래스의 A::y()가 $this->x()를 사용하여 A::x()를 호출하면 하위 클래스의 A::y()가 :: x()는 B::x()에 의해 재정의되고 A::y()는 B::x()를 호출합니다.
위 예제의 결과는 다음과 같습니다.
A::x() was called. A::y() was called. -- B::x() was called. A::z() was called.
virtual-function.php
<?php class ParentClass { static public function say( $str ) { static::do_print( $str ); } static public function do_print( $str ) { echo "<p>Parent says $str</p>"; } } class ChildClass extends ParentClass { static public function do_print( $str ) { echo "<p>Child says $str</p>"; } } class AnotherChildClass extends ParentClass { static public function do_print( $str ) { echo "<p>AnotherChild says $str</p>"; } } echo phpversion(); $a=new ChildClass(); $a->say( 'Hello' ); $b=new AnotherChildClass(); $b->say( 'Hello' );
위 내용은 PHP에서 가상 함수를 구현하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!