PHP面向对象的理解面向对象的思想,既把一系列事物(可以抽象看作一个个体,或者一种类型)的属性,操作看作是一个对象,将其封装为一个类,内部包含这个抽象概念相关的一些属性及相关操作(方法)。php面向对象的三大特征:封装,继承,多态。封装:既把一系列的属性,方法封装在一个类中,给每个属性添加public,protected,private,关键字修饰可以使得这些属性不能被外部轻易访问。private:只能类内部访问操作。protect:受保护类型,用于本类及子类调用public:权限最大,可以内部调用,实例调用,子类调用__get();可以获取private属性(以及没有初始化的属性,比如不存在的)__set();可以设置private属性(以及没有初始化的属性,比如不存在的)__construct():实例化类对象的时候调用,当子类继承父类,子类实例化对象时会默认先调用子类的构造函数,如果希望调用父类的构造函数,则需要在子类的构造函数中通过parent::__construct();访问父类的构造方法,注意此处的关键字parent为小写,同时如果需要访问父类的方法,也可以采用parent关键字访问parent::父类方法名(或者采用父类名::方法名)。__destruct():析构函数,创建对象后,令创建的对象,例如:$a=null.即可调用析构函数继承:通过extends关键字可以继承父类的一些属性(public,protected修饰的),private修饰的变量可以被继承下来,但是无法被访问。php中子类的继承是单继承的,但是可以继承多个接口。通过implement即可继承interface。Trait关键字可以解决php单继承的问题,实现多重继承。多态:多态性是指相同的操作或函数、过程可作用于多种类型的对象上并获得不同的结果,由于php是弱类型语言,所以不同于java,c++不存在重载(既同一函数名,不同类型参数,不同个数的参数),但是自php5后出现了一个魔术方法__call。__call()的作用:当访问不存在的类方法时,调用该方法。例如:ClassA{//name:调用的方法名字。args:参数列表function__call($name,$args){//计算传入的参数个数$num=count($args);If($num==1){$this-test1($args[0]);}else{$this-test2($args[0],$args[1]);}}functiontest1($name){echo$name.“test1”;}functiontest2($name,$ages){echo$name.“test2”.$ages;}}$a=newA();echo$a-a(‘a’);echo$a-a(‘a’,’b’);抽象类abstract:Abstract类不能被实例化,abstract中可以声明变量,常量,普通方法(可选,可以添加其实现)及必须实现至少一个抽象方法(抽象方法不允许有{},既不允许有其实现),abstract中方法可以是public,private,protected。继承的派生类必须把抽象方法重载才能实例化。抽象类继承另外一个抽象类时(目的是对该抽象类的扩展),不能重写父类的抽象方法,抽象类只能单继承。例子:abstractclassA{public$a;publicfunctionA(){echo“实现”;}abstractfunctionB();}接口interface:Interface中只能定义方法及其参数,不能实现,接口中方法必须是public公有的。接口可以声明不能实例化,继承(使用implements)他的类必须实现interface中的方法,一个类可以继承多个接口,一个接口可以继承另一个接口(implement),接口中可以定义常量(const关键字)。例子:InterfaceA{Consta=’a’;PublicfunctionA($a){};//声明接口中的方法}ClasssBimplementsA{PublicfunctionA($a){echo$a;//必须写继承的接口中方法的实现}}只要对象实现了某个接口,就直接可以通过对象调用接口的所有方法,接口实现的类方法有很多,这种现象就称为多态,相同的代码传入的对象不一样,所以具体实现方式也不一样,这就是多态的真正含义。例子:interfaceAnimal{publicfunctionrun();}classDogimplementsAnimal{publicfunctionrun(){echo'dogrun';}}classCatimplementsAnimal{publicfunctionrun(){echo'catrun';}}classContext{private$_animal;//声明Animal接口对象publicfunction__construct(Animal$animal){$this-_animal=$animal;}publicfunctionrun(){$this-_animal-run();}}$dog=newDog();//传入dog对象赋给Animal对象$context=newContext($dog);//通过该对象访问run方法(dog类)$context-run();$cat=newCat();//传入cat对象赋给Animal对象$context=newContext($cat);//通过$context访问run方法(cat类)$context-run();Static关键字:可以给类的属性,方法修饰。类的属性,方法声明为static后,可以直接类名访问操作该属性或方法,static可以被继承。Static关键字定义的变量是一开始就保存在内存中的。例如:classA{publicstatic$a=A;publicstaticfunctiona(){echo这是:.self::$a./br;}}classBextendsA{functionb(){echo这是来自父类的:.parent::$a./br;}}A::$a;A::a();$a=A();$a-a();$b=B();$b-b();静态属性(类属性)只能通过类似:类名::变量名(不需要实例化)而静态方法(类方法)则可以通过对象访问与类名访问的两种方式。Const关键字:定义一个常量。外部访问采用:类名::常量名内部访问采用:Self::常量名注意如果是采用define关键字定义的常量是全局的,注意define关键字不能在类中定义为属性。而Const关键字的定义的常量,仅限于当前空间,Const关键字不能在条件语句中使用。Final关键字:通过Final关键字修饰class可以防止父类被继承。通过Final关键字修饰方法可以防止方法被重写。__autoload():php魔术方法,自动加载机制。通过使用__autoload可以避免一次大量的include,require操作,只有在需要创建对象的时,php自动调用autoload引入文件,每创建一次对象,引入文件后,再次在其他位置创建对象时会自动调用该类实例化对象,而不需要再引入文件了。例子:function__autoload($classname){require_once($classname.'.class.php');/*注意这个class的文件位置与__autoload函数在同一位置*/}命名空间:命名空间的作用类似于一个虚拟的文件目录(既划分代码为不同的区域)。命名空间可以解决重名问题,关键字:namespace声明一个文件所在的虚拟目录位置。注意namespace关键字前不能有任何代码。关键字use使用虚拟目录下的文件。例子:namespaceOther;classA{publicfunctionC(){echoa;}}namespacemain;//命名一个为main的根命名空间useOther\A;$a=newA();$a-C();