类的封装就是把一些相关的属性和行为隐藏起来,从而得到保护和安全。
常用关键字:
public表示全局,该类内部及外部子类都可以使用
protected表示受保护的,只有本类或子类或父类中可以访问,可以继承
private表示私有的,只有本类内部可以使用,不能继承
例:
class myClass
{
public $name;
//定义全局属性
protected $price;
//定义受保护的属性
private function vod()//定义私有方法
{
return $this->name;
}
}
7.1.1 封装相关函数
__set()与__get()用以某些特定操作时候需要获取或向被封装的属性赋值或进行方法操作。
__set()取得当前类中封装过的私有属性或者方法重新执行或赋值操作。
格式:__set(对象名的别名,对应的新值);
__get()取得当前类中封装过属性或方法并转换成共有属性
格式:__get();
例1:
class myClass
{
public $name;
//定义全局属性
protected $price;
//定义受保护的属性
private function vod($name=””)//定义私有方法
{
return “你好”;
}
function ok()
{
return $this->vod();
}
}
$my1=new myClass(“我的电脑”);
echo $my1->name;
//正确
echo $my1->$price;
//出错
echo $my1->vod();
//出错
echo $my1->ok();
//正确
例2:对私有属性的引用
class myClass
{
private $name;
//定义私有属性
function __construct($name=””)
{
$this->name=$name;
}
function __get($name)
{
return “=====”.$this->name.”=====”;
//这样,就可以引用name属性了,返回的值会被加上多个=,但其原有值保持不变
}
}
$my1=new myClass(“我的电脑”);
echo $my1->name;
//正确
输出结果:=====我的电脑=====
例3:对私有属性赋值并引用
class myClass
{
private $name;
//定义私有属性
function __construct($name=””)
{
$this->name=$name;
}
function __get($name)
{
return “==”.$this->name.”==”;
//这样,就可以引用name属性了,但它的值会被加上多个=,且原有值保持不变
}
function __set($n,$v)//$n对应下面赋值时的name,$v则对应赋的值
{
$this->$n->$v;
//这样就修改了属性name的值
}
}
$my1=new myClass(“我的电脑”);
$my1->name=”你的电脑”;
//这样做原本会出错,但由于在定义类时我们使用了__set()将name属
性进行了设置,也就不会出错,并可以对它进行赋值了。
echo $my1->name;
//正确
输出结果:==你的电脑==
7.2.1 继承关键定:exends
PHP类的继承,我们可以理解成共享被继承类的内容。PHP中使用extends单一继承的方法,请切忌:(非C++多继承)被继承的我们称之为父类(基类),继承者称之为子类(派生类)。
7.2.2 PHP继承的规则
依次被继承,Class3拥有Class1、Class2所有的功能和属性。注意:在子类中定义方法和属性时应避免与基类方法和属性重名。
此例先定义了一个类myPc,然后又定义了一个myPc的子类home,这样home就拥有了myPc类中可以被继承的属性和方法。
7.2.3基类方法的重载和基类方法的访问
因为方法和属性的继承是向下继承,即派生类继承基类,故基类不能使用派生类里的方法和属性,但派生类可以使用基类中的方法和属性。当我们在派生类中需要用到基类中的一个方法,但这个方法又不能完成派生类中所需要的功能时,我们可以在派生类中定义一个与基类中当前这个方法名称相同的方法,然后就可以在原有功能的基础上给它定义新的功能,这就是方法的重载。
class home{
function 方法名称(){
基类名称::方法名称;
新的方法的功能
……
}
类的继承举例:
例1:
<?php
class Root{ /*定义基类*/
function dayin(){
return “Root print<br>”;
}
}
class Son extends Root{ /*定义子类*/
function dayin2(){
return “Son print<br>”;
}
}
$p=new Son();
/*实例化类Son()*/
echo $p->dayin();
/*使用子类继承父类的方法dayin()*/
echo $p->dayin2();
/*使用子类中的方法dayin();
*/
?>
输出:输出:Root print
Son print
例2:
<?php
class Root{ /*定义基类*/
function dayin(){
return “Root print<br>”;
}
}
class Son extends Root{ /*定义子类*/
function dayin2(){
return this->dayin(). “Son print<br>”;
/*引用父类中的方法dayin()并与一个字符串连接后返回*/
}
}
$p=new Son();
/*实例化类Son()*/
echo $p->dayin2();
/*使用子类中的方法dayin();
*/
?>
输出:Root print
Son print
例3:
<?php
class Root{ /*定义基类*/
function dayin(){
return “Root print<br>”;
}
}
class Son extends Root{ /*定义子类*/
function dayin(){ /*在子类中定义一个与父类方法相同的方法,即方法重载*/
return Root::dayin(). “Son print<br>”;
/*引用父类中的方法dayin()并与一个字符串连接后返回*/
}
}
$p=new Son();
/*实例化类Son()*/
echo $p->dayin();
/*使用子类重载父类的方法dayin()*/
?>
输出:Root print
Son print