在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; }}
相关推荐:
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!

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

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

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

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

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

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

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

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


Hot AI Tools

Undresser.AI Undress
AI-powered app for creating realistic nude photos

AI Clothes Remover
Online AI tool for removing clothes from photos.

Undress AI Tool
Undress images for free

Clothoff.io
AI clothes remover

AI Hentai Generator
Generate AI Hentai for free.

Hot Article

Hot Tools

SAP NetWeaver Server Adapter for Eclipse
Integrate Eclipse with SAP NetWeaver application server.

PhpStorm Mac version
The latest (2018.2.1) professional PHP integrated development tool

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
Recommended: Win version, supports code prompts!

ZendStudio 13.5.1 Mac
Powerful PHP integrated development environment
