PHP의 클래스 및 객체 예제에 대한 자세한 설명
在php中,类型的继承使用extends关键字,而且最多只能继承一个父类,php不支持多继承。本文主要介绍了php中的类与对象(继承),需要的朋友可以参考下,希望能帮助到大家。
简介
在php中,类型的继承使用extends关键字,而且最多只能继承一个父类,php不支持多继承。
class MyClass { public $dat = 0; public function __construct($dat) { $this->dat = $dat; } public function getDat() { return "$this->dat\n"; } } class MySubClass extends MyClass { public function getDat() { return "dat: $this->dat\n"; } } $a = new MyClass(3); $b = new MySubClass(4); echo $a->getDat(); // 3 echo $b->getDat(); // dat: 4
方法覆盖
包括构造函数在内,子类可以重新定义同名的类方法以覆盖父类方法。覆盖时遵循以下规则:
1.除构造函数之外,其他函数在覆盖时,函数的参数列表必须相同
2.包括构造函数在内,方法被覆盖后,调用子类方法时并不会自动调用父类方法
3.如果父类要禁止方法被子类覆盖,可以使用final来声明方法,这时如果子类仍要覆盖父类方法,将会出错
class MyClass { private $name = ""; public $num = 0; public $str = ""; public function __construct($name) { $this->name = $name; $this->num = 100; $this->str = "none"; } public function getName() { return $this->name; } } class MySubClass extends MyClass { public function __construct($name, $str) { parent::__construct($name); // 调用父类方法 $this->num = "0"; $this->str = $str; echo parent::getName()."\n"; // 调用父类方法 } public function getName() { return parent::getName()."$this->str\n"; // 调用父类方法 } } $b = new MySubClass("myName", true); // myName echo $b->getName(); // myName1 class MyClass { final public function getName() { } }
属性重定义
在子类中,可以访问父类中的public和protected属性成员,除非重定义了同名的自有属性,这时,父类中的属性将无法访问。
方法则不同,子类对方法进行覆盖后,仍然可以访问到父类方法。
class MyClass { public $a = 1; protected $b = 2; private $c = 3; public function f1() { echo "MyClass f1\n"; echo "\$a:$this->a; \$b:$this->b; \$c:$this->c;\n"; } protected function f2() { echo "MyClass f2\n"; echo "\$a:$this->a; \$b:$this->b; \$c:$this->c;\n"; } private function f3() { echo "MyClass f3\n"; } } class MySubClass extends MyClass { public $b = 22; public $c = 33; public function f1() { echo "MySubClass f1\n"; // 继承到父类中的$a属性,直接使用 echo "\$a:$this->a; \$b:$this->b; \$c:$this->c;\n"; // 调用父类中的同名方法 parent::f1(); // 继承到父类中的f2()方法,直接使用 $this->f2(); } // 父类的f3()是私有的,这里的定义与父类无关 public function f3() { echo "MySubClass f3\n"; } } $b = new MySubClass; $b->f1();echo "\n"; /* MySubClass f1 $a:1; $b:22; $c:33; MyClass f1 $a:1; $b:22; $c:3; MyClass f2 $a:1; $b:22; $c:3; */ $b->f3();echo "\n"; /* MySubClass f3 */
重定义父类(同名)属性时,属性的可访问性可以变得更开放,但不能更严格,也就是说,父类中的public属性,不能在子类中修改为private属性。
如果通过子类对象调用父类方法,那么该父类方法在访问属性时,对于重定义了的同名属性,public和protected的属性将访问到子类版本,private属性将访问到父类版本。也可以理解为,public和protected属性可以被重定义(父类的版本被重定义,从而不存在了),而private并未被重定义(父类中的属性仍然存在,通过父类方法进行访问,与子类中是否有同名属性毫不相干)。
class MyClass { public $a = 1; protected $b = 2; private $c = 3; public function f1() { echo "\$a:$this->a; \$b:$this->b; \$c:$this->c;\n"; } } class MySubClass extends MyClass { public $a = 11; // 必须为public protected $b = 22; // 必须为protected或public private $c = 33; public function f2() { echo "\$a:$this->a; \$b:$this->b; \$c:$this->c;\n"; } } $b = new MySubClass; $b->f1(); // $a:11; $b:22; $c:3; $b->f2(); // $a:11; $b:22; $c:33;
范围解析操作符 ::
又冒号常用于访问类常量、类静态变量,也用于在方法覆盖时调用父类版本。与其搭配的还包括parent、self、static等关键字。
class MyClass { const Name0 = "MyClass"; // 类常量 public static $id0 = 0; // 类变量 public function put() { // 将被子类覆盖的方法 echo "MyClass put()\n"; } } class MySubClass extends MyClass { const Name1 = "MySubClass"; public static $id1 = 1; public function put() { parent::put(); // 调用父类版本的对象方法 echo parent::Name0 . "\n"; // 父类常量 echo parent::$id0 . "\n"; // 父类变量 echo self::Name1."\n"; // 子类常量 echo self::$id1 . "\n"; // 子类变量 echo static::Name1 . "\n"; // 子类常理 echo static::$id1 . "\n"; // 子类变量 } } $a = "MyClass"; $ca = new MyClass; $cb = new MySubClass; $cb->put(); echo MyClass::Name0 . "\n"; echo MyClass::$id0 . "\n"; echo $a::Name0 . "\n"; echo $a::$id0 . "\n"; echo $ca::Name0 . "\n"; echo $ca::$id0 . "\n";
在子类中访问父类中的成员时,应避免直接使用父类类名,而应使用parent::,以免破坏父类的封装性。
final
声明为final的方法不能被子类覆盖,如果类声明为final,则此类不能被继承。
// 声明为final的类不能被继承 final class MyClass { private $dat; public function __construct($dat) { $this->dat = $dat; } // final方法不能被覆盖,不过此类已经是final类,方法无必要在声明为final了 final public function getDat() { return $this->dat; } }
相关推荐:
위 내용은 PHP의 클래스 및 객체 예제에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











PHP 8.4는 상당한 양의 기능 중단 및 제거를 통해 몇 가지 새로운 기능, 보안 개선 및 성능 개선을 제공합니다. 이 가이드에서는 Ubuntu, Debian 또는 해당 파생 제품에서 PHP 8.4를 설치하거나 PHP 8.4로 업그레이드하는 방법을 설명합니다.

CakePHP는 PHP용 오픈 소스 프레임워크입니다. 이는 애플리케이션을 훨씬 쉽게 개발, 배포 및 유지 관리할 수 있도록 하기 위한 것입니다. CakePHP는 강력하고 이해하기 쉬운 MVC와 유사한 아키텍처를 기반으로 합니다. 모델, 뷰 및 컨트롤러 gu

VS Code라고도 알려진 Visual Studio Code는 모든 주요 운영 체제에서 사용할 수 있는 무료 소스 코드 편집기 또는 통합 개발 환경(IDE)입니다. 다양한 프로그래밍 언어에 대한 대규모 확장 모음을 통해 VS Code는

CakePHP는 오픈 소스 MVC 프레임워크입니다. 이를 통해 애플리케이션 개발, 배포 및 유지 관리가 훨씬 쉬워집니다. CakePHP에는 가장 일반적인 작업의 과부하를 줄이기 위한 여러 라이브러리가 있습니다.

이 튜토리얼은 PHP를 사용하여 XML 문서를 효율적으로 처리하는 방법을 보여줍니다. XML (Extensible Markup Language)은 인간의 가독성과 기계 구문 분석을 위해 설계된 다목적 텍스트 기반 마크 업 언어입니다. 일반적으로 데이터 저장 AN에 사용됩니다
