面向对象【修饰符,析构,封装,静态等】
对象,在php中,一切皆对象
类,是众多对象抽象出来的,
对象,是由类实例化出来的。
。定义 类
。class 类名
{var $name 成员变量,用var定义,也可以用修饰符代替var定义
var $age 成员变量
function eat(){} 成员方法,描述类的方法
function 类名(){} 构造函数,即使不写也会一直存在,PHP一般用 function __construct(){} 写(注,两个下划线),在造对象的时候执行,
}
。抽象的东西不能直接拿来使用,要先实例化
实例化
$r=new (类名); 先新建一个实例化的人
$r->name="张三" 调用成员变量
$r-> age=1 调用成员变量
$r->eat() 调用成员方法
。访问修饰符
public 共用的 成员变量的var被public替换 成员变量前边加上public就可以变成公用的
protected 受保护的 只能在该类或者该类的子类里边访问
private 私有的 只能在该类访问。 成员变量一般都是私有的,成员方法一般都会公用的。
在private的时候使用 $this->name 调用成员变量name this代表该对象即谁过来调用就是谁。
。析构函数
function __destruct(){ } 在对象函数销毁时执行,不能给代码,他也是一个自动调用函数
函数重载 是一种编译多态,(php中没有,一般在强类型语言里面)
public void Text(string s){echo “111”}
定于关键词 返回值 名称 类型 输出的数据
public void Text(string s){echo “111”}
public void Text(int a){echo “int”}
public void Text(string s,string a){echo “222”}
即根据输入类型或者个数不一样,会调用Text()不同的功能
。面向对象
面向对象有三大特性,即封装,继承和多态。
封装,为了让类更加安全
class Ren
{
private $name;
function setName($n) 设置name的值,可以加限制条件。
{
$this->name=$n;
}
function setName() 获取name的值。
{
return $this->name;
}
}
封装要满足的条件,
,1 成员变量为私有,外界无法访问。
,2 做成员方法来间接访问。
,3 可以在该方法里加限制条件。
。魔术方法
魔术方法写在类里面,会在执行时直接调用,用法没有变。
class Ren
{
private $name;
private $sex;
function __set(变量名称,变量值) 赋值
{
$this->变量名称=变量值;
}
function __get($n) 取值
{
return $this->$n;
}
}
。继承
子类可以继承父类的一切,出来私有的,即加了private的。
单继承,只能有一个父类,也可以对父类进行重写,即定义一个和父类一样的方法。
parent ::方法名() 可以调用父类,,这样会先执行父类的然后再加上重写的。
class Ren
{
$name;
}
class China extends Ren 继承的关键词extends
{ }
。多态
当父类引用指向子类实例的时候,由于子类对父类进行重写,该引用在调用方法的时候表现出的不同。
子类可以代替父类。
。静态
普通成员 是属于对象的。
静态成员 是属于类的 关键字 static
class FenBi
{
public $length;
public static $corlor;
public static function test()
{
echo "这是静态方法"
}
public function ceshi()
{
echo self::corlor 调用静态成员的方法 self加双冒号,普通成员方法可以调用静态对象
}
}
$a=now FenBi;
$s->length; 普通成员调用方式
$FenBi :: $corlor 静态成员的调用方式
FenBi::test() 不用造对象就可以直接调用静态成员方法,静态成员方法不能调用普通成员,因为普通成员属于对象,不属于类
FenBi::test() 普通成员方法可以调用静态对象
。抽象
抽象的关键字 abstract 抽象类,因为太过抽象,不能被实例化,常被用作为父类存在
abstract class DongWu
{
public $name;
abstract public function test(); 因为抽象类太过于抽象,抽象函数不能出现函数体。
}
class Dog
{ }
$d=new Dog ;
var_dump($d); 不可以读取,因为子类在在继承父类方法时,要重新写抽象方法
1,因为抽象类太过于抽象,抽象函数不能出现函数体。
2,子类在在继承父类方法时,要重新写抽象方法
3,包含抽象方法的类一定是抽象类
。接口
接口,极度抽象的类 关键词 interface
interface IUSB
{
public function read();
public function write();
}
class ShuBiao implements IUSB implements 相当于继承,在接口处称为实现
{
public function read( “可读”);
public function write("可写");
}
总结:1,接口里面没有成员变量。
2,接口里的函数全部是抽象函数,没有函数体
3, 接口里默认函数为抽象函数,不用写关键字 static
。__tostring
class Ren
{
public $name;
public function __tostring()
{ return "这里是人类里面的名字选项"}
}
$r=new Ren;
echo $r; 在这里用echo会报错,因为加了__tostring 就可以直接输出
。克隆
class Ren
{
public $name="张三";
public function __clone()
{
$this->name=" 李四" ; 改变克隆的值。
}
}
$r=new Ren();
$c=clone $r; c克隆r, 完全克隆,但是改变c的值不会影响r的值。
。加载类
1,in clude(“地址”) 在相同目录下 ./class文件名.class.php
2,in clude 空格“地址”
3,require(“地址”)
4,require空格“地址”
5,require_once("地址")
6,require_once空格“地址”
。自动加载类
function __autoload($classname)
{
require_once "./".$classname."class.php"
}
注意:1,所有类文件写在同一个目录下
2,类文件命名要一致
3,类的文件名要和文件名一致