PHP面向对象其他知识
一、静态
静态指类里面的成员和方法的一种状态,指定静态的成员和方法称为静态成员和静态方法,它们的只指向类,是属于类的而非属于对象的,即抽象出来的类有恒定的实际属性和结果唯一的方法,不会随着对象的不同而改变,所以只要类名确定,其对应的静态成员和静态方法可以直接调用,不需要通过实例化对象。
静态方法里面不可以包含普通成员,因为调用静态方法可以不造对象就调用,这时候普通成员因为没有对象是无意义的,
普通方法可以包含静态成员,
class FenBi{ public static $color; //静态成员 public $length; //普通成员 public static function test(){ //静态方法,不可以包含普通成员 echo FenBi::$color."的粉笔"; } public function show(){ echo "长度为{$this->length}的".FenBi::$color."粉笔"; //可以包含静态成员 } } FenBi::$color = "红色"; //类访问静态成员并赋值 FenBi::test(); //调用静态方法 $fb = new FenBi();//实例化对象 $fb->length = 10;//访问普通成员并赋值 $fb->show();//调用普通方法
在一盒粉笔中,粉笔的颜色是固定的,可以作为静态成员,长度是长短不一的,为普通成员
二、抽象
抽象类:更加抽象的一个类,无法去直接实例化对象,主要作为父类存在,抽象类里面可以包含成员变量和普通方法,
抽象方法:抽象的一个方法,不能直接调用,用于在父类里面规定子类要实现的功能,正常的类里面不能包含抽象方法,所以子类必须重写父类里面的抽象类
abstract class Ren{ //抽象类 public abstract function say(); //抽象方法 } class China extends Ren{ //子类 public function say(){ //子类必须重写其父类的抽象方法 echo "你好"; } }
接口(面向对象的接口):极度抽象的类,接口里只能包含抽象方法,不能出现普通成员和普通方法
interface USB{ //定义接口 public function read(); //接口内的抽象方法不能有函数体 public function write(); //接口内的抽象方法不能有函数体 } class Mouse implements USB{ //子类鼠标 public function read(){ //重写父类的抽象方法 echo "鼠标插入"; } public function write(){ //重写父类的抽象方法 echo "鼠标供电中"; } }
接口的另一种含义是API:网络数据接口,(Application Programming Interface,应用程序编程接口)是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节。
三、加载类
在网页文件中引入类,
1.include("路径地址"); 不能重复出现;include_once("路径地址"); 只引用一次,可以多次出现
这种方法引用类,当引用的类出现错误时,不会影响网页文件本身代码的执行
include_once("./ceshi.php");
2.require("路径地址");不能重复出现;require_once("路径地址");只引用一次,可以多次出现
这种方法引用类,当引用的类出现错误时,会影响网页文件本身代码的执行
require_once("./ceshi.php");
3.自动加载,条件:类的命名要规范,所有的类要放在同一个文件夹下
类的文件名命名规范,类名.class.php,引用方法
function __autoload($classname){ renquire_once"路径地址"; }
四、克隆对象,
克隆出一模一样的对象,如果要在克隆的时候进行修改,则要预先写好魔术方法
class Ren{ //定义一个人类 public $name; //普通成员 public $sex; public $height; public function __clone(){ //魔术方法 $this->name = "李四"; //$this代表副本,当克隆对象是自动把$name换为李四 } } $r = new Ren(); //实例化对象 $r->name = "张三"; //给对象的普通成员依次赋值 $r->sex = "男"; $r->height = "178"; $r1 = clone $r; //克隆出一模一样的对象,但是名字改为李四
五、其他
当用echo直接输出对象时会报错,如果想要输出对象,就要在类里面预先写好魔术方法把对象的信息写在方法里,
class Ren{ //定义一个人类 public $name; //普通成员 public function __tostring(){ //输出信息用的魔术方法 return "{$this->name}"; //输出内容为代码的内容,需要return } } $r = new Ren(); //实例化对象 $r->name = "张三"; //给对象的普通成员赋值 echo $r; //输出对象不报错