php--类,接口
创建一个类:class className{}
调用(实例化类): new className();如果,构造函数__construct()带有参数,new className($val,$val2...);
*如果没有__construct方法,那么与类名同名的方法就是构造函数
*析构函数不能带参数,在内存中注销一个类。__destruct()
*php不会自动调用父类的构造函数,则在子类中用parent::__construct()调用或 otherclassName::__construct()
*类的家庭成员:属性,方法,常量,静态成员 (const,static)
*使用_set($n,$v)和__get($n)来赋值和取值,使用__set()可以统一管理属性和统一验证数据。这两个函数对private属性搭理。
类中,设置__set(),__get()两个魔术方法为私有方法,在外部则可以直接对私有属性赋值和获取,php脚本会自动调用这两个函数。
*属性,方法调用: 类中-$this->属性/方法名 或者 className::属性/方法名;外部-elementName->属性/方法名
*类中定了用const定义了一个常量,类中-$this::constName或者className::constName;外部-elementsName::constName
*静态成员调用:类中-self::$memberName;外部-className::$memberName (如果成员是属性则加上$)
*静态成员可以被所有类的实例化调用,静态属性的值会保存累计
__toString()用于将类转换成字符串打印出来
__clone() 克隆对象时,改变某些值调用该方法
__call($member,$arguments) 对象调用一个不可见(不存在,无权限)的方法时自动调用,$member为方法名,$arguments为参数集合
__callStaic()对象调用一个不可见(不存在,无权限)的静态方法自动调用
类的继承:class A{ } class B extends A{ }
方法和属性的作用域(六种):public,private,protected,abstract,final,static
final-只能修饰方法,阻止子类继承(即重载)该方法
stract-抽象理解成父类为子类定义了一个模板或基类。只能在父类中申明,子类中实现。eg.abstract class className{ }
-----1,抽象类不能实例化,只有被子类(具体类)继承后实现。
-----2,抽象类必须在子类中实现其所有抽象的方法,否则会报错。
-----3,抽象类方法中只能声明,不能实现。eg. abstrac function functionName() 后面{ }都不用带
-----4,属性不能被命名为abstract
-----5,只有声明为抽象的类才能被声明抽象方法,抽象方法只能声明,不能被实现。
抽象类中,如果要实现具体方法,不能声明为抽象类。这样实际意义更大些。我们可以把几个类库的共同部分提取到抽线类中,其他类继承抽象类即可。
类的管理
-----instanceof,用于分析一个对象是否是一个类的实例或子类或是实现了某个特定的接口。(类名没有边界符)
eg. if($a instanceof test) $a为对象,test为类名
-----boolea class_exist(string className),确定类是否存在
-----string get_class(object),返回类名,没有则返回false
-----array get_class_vars(string className),返回所有自定义的public属性和其相应的值
-----array get_class_methods(string className [object objectName]),返回包括__construct在内的所有非私有方法
-----print_r(get_declared_classs());打印该php版本所有类名
-----get_parent_class(类名/对象)
-----interface_exist(),确定接口是否存在
-----is_a($obj,'className'),确定对象的类型,当$obj属于className或属于其子类时返回true
-----is_subclass_of($obj,'className'),确定是某类的子对象
-----method_exist('className','funName'),确定是某类或某对象的方法。(此参数使用非public定义的方法)
自动加载类库文件
__autolaod($class)
-----1,该函数(不是类函数)放哪没有关系,创建实例的时候系统自动调用。条件:该页面的创建的实例使用的类名,被调用的文件名
以及文件中的类名必须形同。否则单独调用__autoload('c'),给文件名一个前缀。
对象克隆
------当克隆一个对象的实例,其属性初始值被继承了被克隆对象的当前值。
eg. $a=new test(); $b=clone $a; 如果类中有__clone(),则克隆时调用这个函数。
对象继承
------final声明的类不能被继承,final,private声明的方法不能被继承
------构造函数在继承中的特性,如果子类中没有构造函数,php会自动向上(继承类)索搜,找到就停止,使用该构造函数。
如果子类有自己的构造函数要使用父类的构造函数,在__construct(){parent::__construc()} ,如要使用更上一级的
可以类名::__constrct()
子类中调用父类的属性或方法(3种)
------1.$this->parentFunction() 2.父类名::parentFunction() 3.parent::parentFun()
重载
------在子类中,可以定义与父类相同的属性和方法,改变父类该属性或方法的值,称重载。
接口
------interface,可以理解为一组功能的规范,多人协作时,可以为各自的开发定义一个共同的方法名称。
------1,不能再接口中对方法具体实现和定义。只能由具体类来实现
------2,跟抽象类一样,可以定义常量,由具体类继承
------3,具体类必须实现抽象类的所有抽象方法(非抽象方法除外)。具体类通过implements实现了接口后,必须完成接口中的所有方法
eg. 创建接口- interface Name{}
继承接口- class className implements InterfaceName { }
继承多个接口- class className [extends className] implements InterfaceName1,InterfaceName2,...{ }
何时用接口,何时用抽象?
------1,相关性:当创建的模型紧密相关用抽象类。而相关性不高则用接口。
------2,多重继承:php类可以继承多个接口,但不能继承多个抽象类。
------3,公共性行为实现:抽象类可以在其中实现公共方法,而接口不能。
命名空间
------1,命名空间下受影响的代码:类(抽象类和traits),接口,函数和常量
------2,要在所有代码之前命名空间,除declare关键字。
------3,声明单个命名空间,eg. namespace MyProject
声明分层次的单个命名空间,eg. namespace MyProject\Sub\Level
一个文件中声明多个命名空间,eg. namespace MyProject{ } namespace AnotherMyProject{ }
------4,非限定名称 eg. $a=new foo();如果当前命名空间是currentnamespace,foo将被解析为currentnamespace/foo。如果foo是
全局代码,zefoo会被解析为foo。
限定名称 eg. $a=new subnamespace\foo。如果当前命名空间是currentnamespace,解析为
currentnamespace\subnamespace\foo,否则解析为subnamespace\foo
完全限定名称,或包含了全局前缀操作符的名称 eg. $a = new \currentnamespace\foo(); \currentnamespace\foo::staticmethod()
总是被解析为:(literal name)currentnamespace\foo
注意访问任意全局类、函数或常量,都可以使用完全限定名称,例如 \strlen() 或 \Exception 或 \INI_ALL
------5,___NAMESPACE__,包含当前命名空间名称的字符串,全局代码中则为''。
namespace\blah\mine 表访问当前命名空间或子命名空间中的元素
------6,使用user操作符导入/使用别名 (前面斜杠不推荐,因为导入的必须是完全限定名称)
use My\Full\ClassName as Another
迭代(iteration)
-------php5提供了一种迭代对象的功能,像数组通过foreach来遍历对象中的属性。默认在外部,只能得到外部可见的属性。
类中,foreach($this as $key => $value){}
外部,foreach(实例名 as $key => $value){}
反射(reflection)
-------class a{...} ; $c=new ReflectionClass('a');php内置类;echo '<pre>'.$c.'</pre>';输出类a的结构和内容
浙公网安备 33010602011771号