search
HomeBackend DevelopmentPHP TutorialDetailed explanation of class and object inheritance in php
Detailed explanation of class and object inheritance in phpMar 16, 2018 pm 04:01 PM
phpinheritDetailed explanation

在php中,类型的继承使用extends关键字,而且最多只能继承一个父类,php不支持多继承。本文主要和大家分享的是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中的类与对象示例详解

php类与对象接口定义介绍和用法实例详解

The above is the detailed content of Detailed explanation of class and object inheritance in php. For more information, please follow other related articles on the PHP Chinese website!

Statement
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
php怎么把负数转为正整数php怎么把负数转为正整数Apr 19, 2022 pm 08:59 PM

php把负数转为正整数的方法:1、使用abs()函数将负数转为正数,使用intval()函数对正数取整,转为正整数,语法“intval(abs($number))”;2、利用“~”位运算符将负数取反加一,语法“~$number + 1”。

php怎么实现几秒后执行一个函数php怎么实现几秒后执行一个函数Apr 24, 2022 pm 01:12 PM

实现方法:1、使用“sleep(延迟秒数)”语句,可延迟执行函数若干秒;2、使用“time_nanosleep(延迟秒数,延迟纳秒数)”语句,可延迟执行函数若干秒和纳秒;3、使用“time_sleep_until(time()+7)”语句。

php怎么除以100保留两位小数php怎么除以100保留两位小数Apr 22, 2022 pm 06:23 PM

php除以100保留两位小数的方法:1、利用“/”运算符进行除法运算,语法“数值 / 100”;2、使用“number_format(除法结果, 2)”或“sprintf("%.2f",除法结果)”语句进行四舍五入的处理值,并保留两位小数。

php字符串有没有下标php字符串有没有下标Apr 24, 2022 am 11:49 AM

php字符串有下标。在PHP中,下标不仅可以应用于数组和对象,还可应用于字符串,利用字符串的下标和中括号“[]”可以访问指定索引位置的字符,并对该字符进行读写,语法“字符串名[下标值]”;字符串的下标值(索引值)只能是整数类型,起始值为0。

php怎么根据年月日判断是一年的第几天php怎么根据年月日判断是一年的第几天Apr 22, 2022 pm 05:02 PM

判断方法:1、使用“strtotime("年-月-日")”语句将给定的年月日转换为时间戳格式;2、用“date("z",时间戳)+1”语句计算指定时间戳是一年的第几天。date()返回的天数是从0开始计算的,因此真实天数需要在此基础上加1。

php怎么读取字符串后几个字符php怎么读取字符串后几个字符Apr 22, 2022 pm 08:31 PM

在php中,可以使用substr()函数来读取字符串后几个字符,只需要将该函数的第二个参数设置为负值,第三个参数省略即可;语法为“substr(字符串,-n)”,表示读取从字符串结尾处向前数第n个字符开始,直到字符串结尾的全部字符。

php怎么替换nbsp空格符php怎么替换nbsp空格符Apr 24, 2022 pm 02:55 PM

方法:1、用“str_replace(" ","其他字符",$str)”语句,可将nbsp符替换为其他字符;2、用“preg_replace("/(\s|\&nbsp\;||\xc2\xa0)/","其他字符",$str)”语句。

php怎么判断有没有小数点php怎么判断有没有小数点Apr 20, 2022 pm 08:12 PM

php判断有没有小数点的方法:1、使用“strpos(数字字符串,'.')”语法,如果返回小数点在字符串中第一次出现的位置,则有小数点;2、使用“strrpos(数字字符串,'.')”语句,如果返回小数点在字符串中最后一次出现的位置,则有。

See all articles

Hot AI Tools

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Undress AI Tool

Undress AI Tool

Undress images for free

Clothoff.io

Clothoff.io

AI clothes remover

AI Hentai Generator

AI Hentai Generator

Generate AI Hentai for free.

Hot Tools

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

Integrate Eclipse with SAP NetWeaver application server.

PhpStorm Mac version

PhpStorm Mac version

The latest (2018.2.1) professional PHP integrated development tool

DVWA

DVWA

Damn Vulnerable Web App (DVWA) is a PHP/MySQL web application that is very vulnerable. Its main goals are to be an aid for security professionals to test their skills and tools in a legal environment, to help web developers better understand the process of securing web applications, and to help teachers/students teach/learn in a classroom environment Web application security. The goal of DVWA is to practice some of the most common web vulnerabilities through a simple and straightforward interface, with varying degrees of difficulty. Please note that this software

SublimeText3 English version

SublimeText3 English version

Recommended: Win version, supports code prompts!

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

Powerful PHP integrated development environment