php面向对象必知会

<?php
/**
 *     面向对象基础
*声明:[修饰类的关键字]class 类名{
* 成员(成员属性:变量;成员方法:函数) }
*命名:类名.class.php,方便自动加载
*变量和函数名驼峰式命名,类名首字母大写;
*$对象引用=new 类名;
*变量成员的调用不用$
*构造方法就是对象创建完成后第一个调用的方法;
*php4中和类名相同的就是构造方法;
*php5中,构造方法使用魔术方法__construct();
*每个魔术方法都在不同时刻为了完成某一个功能自动调用的方法
*__destruct();用于关闭资源,做一些清理工作。
*例如类内调用的__get(),__set(),__isset(),__unset(),__clone(),__call(),__sleep(),__weakup(),__toString()

*类外调用,唯一一个__autoload();


*一.封装:就是把对象的成员(属性和方法)结合成一个独立的相同单位,并尽可能隐藏对象的内部细节
*封装可提高安全性
*封装使用private(只能在对象内部用$this访问
*1.方法的封装主要用于内部的一个主方法借助其他若干小方法工作,这些小方法没有单独存在的意义,就可以用private把这些小方法封装起来
*2.属性的封装,只要变量在多个方法中都用到就将该变量声明为成员属性。封装属性为了不让属性值在实例化后随意读取和更改。类内访问不受影响。封装后可以通过调用共有方法传参来改值,可以在public方法中限制值的范围。可通过方法的return来读取私有属性。
*3.如果要设置和取值的属性很多可用魔术方法__set和__get来操作。
*4__get获取成员属性的值时自动调用,必须有一个参数__get($proname),为传进来的属性名,实例化后获取哪个私有属性就会把哪个私有属性传进来,__get方法内使用$this->$proname;来获取(ps:$proname只是一个参数,并不是成员属性,故调用时加上$),经过方法就可以判断传进来的成员属性是哪一个,从而写程序来控制。
*5__set为成员属性设置值时自动调用,有两个参数__set($proName,$proValue),__set方法内使用$this->$proName=$proValue;来设置值。
*6__isset($proName)查看私有属性是否存在时自动调用,方法内加上 return isset($this->$proName),禁止判断是否设置可通过判断传进来的属性名return false;即可
*7__unset($proName)直接删除对象中私有属性时调用,方法中加上unset($this->$proName);
*
*二.继承
1.父类:基类;    子类:派生类
*开放性,可扩充性,增加代码的重用性,提高可维护性
*如果两个或两个以上类中有公用的部分,那么公用的部分就可以作为父类;
*继承就是在父类的基础上“扩展”父类的功能;
*C++多继承,同一个类可以有多个父类;
PHP属于但继承,同一个类只能继承一个父类;
但一个类都可以有多个子类;
*2.子类声明用extends关键字,格式:class 子类名 extends 父类名{
},子类不能继承私有方法
*3.成员属性一般先声明,加关键字private,protected,public再用__construct设置值,这样即使是私有属性子类也可以用;
*protected类内和子类可用,类外不能用;
*4.子类重载父类的方法;重载即方法名相同但参数类型不同。强类型语言可通过指定参数类型实现。PHP中子类方法名与父类相同则会覆盖父类同名方法,还可以扩展此方法;
*在覆盖父类方法的子类中调用父类方法使用父类名::方法名();即对象->成员;类::成员;
*5.借助父类初始化:parent:: __construct(属性1,属性2,属性3,........);
*6.注意:子类只能放大权限不能缩小权限,例如父类为public子类必须为public,父类为protected,则子类可为protected或public。
*
*三.多态  
*多态:  多态是面向对象的三大特性之一
 *
“多态”是面向对象设计的重要特性,它展现了动态绑
定(dynamic binding)的功能,也称为“同名异
式”(Polymorphism)。多态的功能可让软件在开发和维护
时,达到充分的延伸性(extension)。事实上,多态最直接
的定义就是让具有继承关系的不同类对象,可以对相同名称
的成员函数调用,产生不同的反应效果。
例如:
interface Test{
 fuanction aaa();
 fuanction bbb();
 }
class one implements Test{
 function aaa(){
  echo "aaaaaaaaaaaaa";
  }
 function bbb(){
  echo "bbbbbbbbbbbbbbb";
  }
}

class Tow implements Test{
 function aaa(){
  echo "11111111111111111";
  }
 function bbb(){
  echo "2222222222222222222";
  }


}
$a=new Two;
$b=new one;
$a->aaa();
$b->aaa();
*
*1抽象类是一种特殊的类,接口是一种特殊的抽象类,多态就是要用到抽象类和接口
*抽象类和接口的作用一样,功能有所不同  
*抽象方法:若一个类中的方法没有方法体,而直接使用;结束的就是抽象类。方法体就是方法中的{},例如:function test();
*若一个方法是抽象方法,就必须使用abstract关键字修饰,
* 抽象类:若类中存在抽象方法,则该类就是抽象类;
*抽象类也需要abstract关键字修饰,其特殊性就在于它有抽象方法;  
*抽象类不能实例化对象,类内的成员也不能直接被访问。  
*要想使用一个抽象类就必须用一个类去继承抽象类,子类不能再是抽象类,子类可重写抽象类的方法,给抽象方法加上方法体即可实例化子类。
*子类必须实现抽象类中抽象方法,即子类必须有抽象类的方法名。其本质就是定义一些规范让子类按这些规范去实现自己的功能。
*目的:将自己写的程序块加入到 原来写好的程序中去;
*2.接口是为了解决PHP不能多继承,若使用抽象类则继承抽象类的子类就不能再继承其他类。若既想实现一些规范又想继承其他的类就要使用接口。
*3.接口与抽象类的对比:
*(1作用相同,都不能创建对象,都需要子类去实现
*(2接口的声明不一样,
*(3 接口被实现的方式不一样 ,interface 接口名{  }  
*(4接口的所有方法必须是抽象方法,但不需要abstract修饰
*(5接口 的成员属性只能声明常量,用const HOST="localhost";常量可通过  类名::常量  直接访问
*
*(6接口中的成员访问权限都必须是public,抽象类中最低的访问权限是protected,
*(7子类实现接口用implements关键字 ,接口之间的继承还是使用extends;
*可以使用抽象类去实现接口中的部分方法
 *如果想让子类可以创建对象,则必须实现接口中的全部抽象方法
 *    
 *    可以定义一个接品口去继承另一个接品口
 *
  *    一个类可以去实现多个接口(按多个规范去开发子类), 使用逗号分隔多个接口名称
 *
 *    一个类可以在继承一类的同时,去实现一个或多个接口(先继承,再实现)
 *例如:class Man extends Person implements Woker,Students,Teachers{   }
 *    使用implements的两个目的
 *     1. 可以实现多个接口 ,而extends词只能继承一个父类
 *     2. 没有使用extends词,可以去继承一个类, 所以两个可以同时使用
** 1   class 类名{
 *
 *    }//普通类
 *
 * 2   abstract class 类名 {
 *
 *    }//抽象类
 *
 *   声明方式
 *
 * 3  interface 接口名{
 *
 *   } //接口
*  
*  
*  
*  
*  
*四.PHP中常用的关键字和魔术方法  
*1.final不能修饰成员属性,只能修饰类和方法;
使用final修饰的方法不能被继承和重写(覆盖)
*2.static可以修饰成员属性和方法,不能修饰类
static修饰的成员属性可以被同一类的所有对象共享;
静态数据存在内存中的数据段(初始化静态段);
静态数据是在类第一次加载时分配到内存中的,以后直接在内存中调用
*注意:静态成员直接使用类名去访问,不用创建对象,访问格式 类名::静态成员,例如Parent::go();这种格式还用于覆盖父类方法的子类中调用父类方法使用父类名::方法名()  
*若在类中使用静态成员可用self代表本类($this代表本对象),例如self::go();
*静态的成员方法不能访问非静态的成员,因为非静态的成员就必须用对象来访问,$this就表示调用它的对象,而静态成员不用对象来去调用,$this就不能代表哪个对象
*若确定一个方法不使用非静态的成员则可将这个方法声明为静态方法(不用创建对象直接通过类名就可以访问);
*3.const只能修饰成员属性,用于在类中声明常量,与define功能相同,访问方式和静态成员相同。
类内使用seif::常量  类外 类名::方法
*常量一定要在声明时给初值,存储与数据段
*__call($methodName,$arg1,$arg2....) 调用系统中不存在的方法时自动调用,用于处理调用不存在方法时的错误提示。
*__toString(){return "wwwwwwwwwww";}直接输出对象引用时调用
*__clone()可以没参数。与原对象各占一个内存空间,若是把对象引用赋值给一个变量,则这个变量和原对象指向同一个内存地址;
*其作用与构造方法类似,用于给克隆方法初始化。其中的$this指的是克隆出来的副本的对象,$that代表原本对象;
*用法:$p=new Person;  $p1=clone $p;
*4__autoload($className){include './'.$className.'class.php';}唯一一个不在类中添加的方法;用于在类外部自动加载类,只要用到外部类名就会被自动加载
*5__sleep(),序列化时自动调用的方法;可以将一个对象部分串行化。只要这个方法中返回一个数组,数组中有几个成员属性就序列化几个成员属性,若不加这个方法则所有成员都被序列化了,
例如function __sleep(){
return array(name,age);//将成员属性name和age序列化
}
*其本质就是规定属性中需要序列化的成员属性

*
*对象串行化,将一个对象转化成一个二进制串存储于内存中;
*用于将对象长时间存储于数据库或文件中,或将对象在多个PHP文件中传输时;  
*例如:$p=new Person();
    $str=serialize($p);//将对象转化成二进制串
    file_put_contents("p.txt",$str);//写入文件
   
    $str2=file_get_contents("p.txt");
    $pp=unserialize($str2)//反序列化.得到的$pp与原对象$p相同;
 
 
*6__wakeup()是在反序列化时自动调用的方法,为序列化后的对象初始化(有对象诞生就要初始化);
*
*  
*  
*  
*  
*  
*  
 
*  
*  
*  
*  
*/
class Person{
var $name;
var $age;
var $sex;
function say() {
 echo"说话";
 echo $this->name='lll';
}

function run() {
 echo "跑";
}


}
$p1=new Person;
$p2=new Person;
$p1->say();
echo $p1->name='李勇';
echo $p2->age;

?>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

少林码僧

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值