PHP面向对象02:面向对象高级 一、设计模式1. 单例模式2. 工厂模式 二、面向对象三大特性1. 封装2. 继承3. 多态 三、继承1. 实现继承2. 有限继承a. 属性都能继承b
class Singleton{ private static $obj = null; private function __construct() { } private function __clone() { } public static function getInstance() { if (!(self::$obj instanceof self)) { self::$obj = new self(); } return self::$obj; }}
phpclass Man{ public function display() { echo "这是男人"; }}class Woman{ public function display() { echo "这是女人"; }}// 工厂类class HumanFactory{ public static function getInstance($classname) { switch ($classname) { case 'w': return new Woman(); case 'm': return new Man(); default: return null; } }}$woman = HumanFactory::getInstance('w');$man = HumanFactory::getInstance('m');$woman->display(); // 这是女人$man->display(); // 这是男人
extends
。public
成员。class Human { public function eat() { echo "eat"; }}class Man extends Human {}$man = new Man();$man->eat();
外部访问不了,只能在类内部访问
class Human{ public $name = "Human"; public function show(){ echo __CLASS__; }}class Man extends Human { public $name = "Man"; public function show() { echo __CLASS__ . "HelloWorld"; }}$man = new Man();echo $man->name; // Man$man->show(); // ManHelloWorld
parent
关键字parent
只能访问方法和静态属性,不能访问成员属性(被重写的属性直接没了)。class Human{ public function show(){ echo __CLASS__; }}class Man extends Human { public function show() { parent::show(); echo __CLASS__ . "HelloWorld"; }}
static
,即当方法被访问时,哪个类访问就绑定那个类。class Human{ public static $name = 'Human'; public static function getName() { // 静态绑定 echo self::$name."
"; // Man访问,依旧输出Human的name // 静态延迟绑定 echo static::$name . "
"; // Man访问,输出Man里面的name }}class Man extends Human{// 重写静态成员 public static $name = 'Man';}Man::getName();
final
关键字修饰。class Man{ // 最终方法 final public function getName(){ echo __CLASS__; }}// 最终类final class Boy extends Man{}
abstract
关键字修饰。// 抽象类abstract class Human{ // 抽象方法 abstract public function eat(); // 普通方法 public function drink(){ echo "喝水"; }}// 抽象类只能被继承class Man extends Human{ // 实现抽象方法 public function eat() {}}
interface
关键字定义,用来规范一些共性类必须实现的方法。interface Human { // 接口中只能存在接口常量和抽象方法 const NAME = "人"; // 默认是抽象方法 public function eat();}// 实现接口class Man implements Human{ // 实现方法 public function eat() {}}
interface Human {}interface Animal{}interface Dog extends Animal{}interface Ape extends Human,Animal{}
# 定义接口interface Human { const NAME = "人"; public function eat();}# 抽象类实现接口abstract class Woman implements Human { abstract public function drink();}# 普通类继承抽象类,必须实现所有抽象方法。class Girl extends Woman { public function eat() { echo "吃饭"; } public function drink() { echo "喝水"; }}
trait
是为PHP准备的一种代码复用机制,类似于class
。trait
内部可以拥有成员属性、成员方法、静态成员,但不能有常量。trait
不是类,不能被实例化。trait
是用来将公共代码提供给其他类使用的,类使用trait
的前提是加载对应的trait
。trait Eat{ public $time = 100; public function showtime(){ echo $this->time; }}class Man{ // 引入trait公共代码 use Eat;}// 可以直接使用$man = new Man();$man->showtime();
trait
trait Eat{ ...}trait Sleep{ ...}class Man{ use Eat, Sleep;}
trait
有同名方法,处理冲突的方法是 insteadof 代理处理和对被替换方法使用别名。trait Eat{ public function show(){ echo "吃饭"; }}trait Sleep{ public function show(){ echo "睡觉"; }}class Man{ use Eat, Sleep{ // 明确使用Eat里面的show方法 Eat::show insteadof Sleep; // Sleep的show方法改名为shows Sleep::show as shows; }}$man = new Man();$man->show();$man->shows();
trait
中同名的属性,但方法可以(类方法覆盖trait方法)。trait
与父类中有同名方法, trait
方法将覆盖父类同名方法。如果要访问父类方法,可以使用 parent
关键字。trait Eat{ public function show(){ echo "吃饭"; }}class Human{ public function show(){ echo "人"; }}class Woman extends Human{ use Eat;}$woman = new Woman();$woman->show(); // 吃饭
trait
不能自己访问,只能用来给其他代码提供代码复用。trait
时,使用更高的访问控制权。trait Drink{ private function show(){ echo "喝水"; }}class Girl{ use Drink{ # 修改访问控制权 show as public eshow; }}$girl = new Girl();$girl->eshow(); // 喝水
trait
可以使用抽象方法,用来规范使用类必须实现对应抽象方法。使用类要么是抽象类,要么必须实现抽象方法。__
开始。构造方法、析构方法、克隆方法都是魔术方法。方法名 | 说明 |
---|---|
__get($key) | 读属性时触发 |
__set($key, $value) | 写属性时触发 |
__isset($key) | 外部调用isset函数或empty函数时触发 |
__unset($key) | 外部调用unset函数删除对象属性时触发 |
__toString() | 对象被当成普通变量输出或连接时触发 |
class Human{ private $age = 10; // 读取控制 public function __get($name) { echo $name . '----' . __METHOD__; $allow = array('age'); if (in_array($name, $allow)) { return $this->$name; } return false; } public function __set($name, $value) { echo $name . ":" . $value . "----" . __METHOD__; } public function __isset($name) { echo $name . '----' . __METHOD__; } public function __unset($name) { echo $name . '----' . __METHOD__; } public function __toString() { echo '----' . __METHOD__; return "123"; }}
方法名 | 说明 |
---|---|
__call($function_name[,$args]) | 对象调用不可调用方法时触发 |
__callStatic($function_name[,$args]) | 类访问不可调用静态方法时触发 |
class Man { private function show() {} private static function show2() {} // 方法重载 public function __call($name, $arguments) { // 允许访问的方法 $allow = array('show'); if (in_array($name, $allow)) return $this->$name($arguments); return false; } public static function __callStatic($name, $arguments) { // 不允许访问 return false; }}
来源地址:https://blog.csdn.net/realoser/article/details/129120184
--结束END--
本文标题: PHP面向对象02:面向对象高级
本文链接: https://www.lsjlt.com/news/387721.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
下载Word文档到电脑,方便收藏和打印~
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0