PHP面向对象(OOP)的封装和多态
OOP的封装
是为了隐藏对象的字段和实现细节,仅对外公开接口,控制在程序中字段的读和修改的访问级别,将抽象得到的数据和行为(或功能)相结合,形成一个有机的整体,也就是将数据与操作数据的源代码进行有机的结合,形成 “ 类 ” ,其中数据和函数都是类的成员。
字段的作用域
public 公共的(类外可以访问 )
private 私有的(类内可以访问 )
protected 受保护的(类内和子类可以访问,类外不可访问 )
方法前面如果没有修饰符,那么默认是外部可访问的公共方法,但为了让程序更加的清晰,建议在前面加上public
类内访问静态属性(使用static声明)
使用类名::$字段名(两个冒号)</strong>或者<strong>self::$字段名(推荐,更改类名时内部代码无需更改)来实现
类内访问非静态属性
在类内访问字段使用关键字$this->字段名来实现
属性操作(字段的赋值与取值)
可以设计两个公共方法,一个方法为setName(),用于赋值,一个方法为getName(),用于取值
class Computer {
private $_name ;
function setName($_name){$this ->_name = $_name ;}// 赋值
function getName() {return $this ->_name;}// 取值
}
$computer = new Computer();
$computer ->setName( 'Name' );
echo $computer ->getName();
常量(constant):在类中可以定义常量,用来表示不会改变的值。对于从该类实例化的任何对象来说,常量前面不需要作用域修饰符
常量值在这些对象的整个生命周期中都保持不变
class Computer {const PI = 3.1415926;}
echo Computer::PI; //类名::常量名,不需要实例化就可以使用
静态类成员
有时候,可能需要创建供所有类实例共享的字段和方法,这些字段和方法与所有的类实例有关
但不能由任何特定对象调用
静态类是保存在数据区的数据,并不与各个实例对象有关,在一个实例对象中改变了一个静态字段或方法的值,那么以后所有该类的实例对象调用该静态字段或方法的时候都是改变以后的
class Computer {public static $_count = 0 ;}
echo Computer:: $_count ;
//类名::静态变量名,不需要实例化就可以调用
//一般来说,必须将字段做成私有化
静态类成员在类内调用需要使用self或static关键字,关键字::字段或方法名
class A{
public static $name='A_name';
public static function run_self(){ echo self::$name; }
public static function run_static(){echo static::$name;}
}
class B extends A { public static $name="B_name'; }
B::run_self(); //返回A_name
B::run_static();//返回B_name
在继承时如果发生重写,如果在父类中使用写法slef::字段返回父类未重写之前的值,而写法static::字段返回重写之后的值。
Instanceof关键字(操作符)
判断一个对象是否是一个类的实例或者是否实现了某个特定接口
在php中如果一个对象是某个类的实例,那么也会认为该对象是这个类的父类的实例
class Computer {}
$computer = new Computer();
echo($computer instanceof Computer);
多态
是指 OOP 能够根据使用类的上下文来重新定义或改变类的性质或行为
或者说接口的多种不同的实现方式即为多态
把不同的子类对象都当作父类来看,可以屏蔽不同子类对象之间的差异,写出通用的代码,做出通用的编程,以适应需求的不断变化。
interface Computer { //创建一个接口来规范运行的方法
public function version();
public function work();
}
class NotebookComputer implements Computer {
public function version() {echo '笔记本';}
public function work() {echo '可以便携运行!';}
}
class DesktopComputer implements Computer {
public function version() {echo '台式机';}
public function work() {echo '不能便携运行';}
}
class Person {
public function run( $type ) {
$type ->version();
$type ->work();
}
}
$person = new Person();
$desktopcomputer = new DesktopComputer();
$notebookcomputer = new NoteBookComputer();
$person ->run( $notebookcomputer );