PHP面向对象学习笔记之一 基础概念

时间:2022-09-25 15:17:49

1> if( "false" ) 等效于 if( true), 因为非空字符串是true 
2> 检查数据类型: 
is_array(); 
is_object(); 
is_string(); 
is_null(); 
is_integer(); 
3> PHP5 引入类的类型提示(type hint),用来约束一个方法的参数类型(不是基本数据类型,而是类):将类名放在需要约束的方法参数之前. 
例如: function write( ShopProduct $shopProduct){} 

4> instanceof 操作符: 如果左边操作数的对象是右边操作数所示的类型,结果为true 
例如: if( $shopProduct instanceof BookProduct ) {} 

5> 继承 class son extends parent{} 
要调用父类的方法, 比如构造函数,用 parent::__construct(); 

6> 静态方法和属性 
class StaticExample{ 
static public $a; 
static public function hello(){} 

外部访问使用:: 
例如: print StaticExample::$a; 
内部访问使用self:: 
例如: self::$a; 

7> 抽象类, 抽象方法 
abstract class xxx{ 
... 
abstract function write(); //没有{} 


抽象类的子类要重新声明方法并实现之. 新实现的方法的访问控制不能比抽象方法的访问控制更严格. 

8>接口 interface 
只定义功能,不包含实现. 接口中可以包含属性和方法声明,但方法体为空; 
例如: interface a{ 
public function b(); 

任何实现接口的类都要实现接口中定义的所有方法,否则就必须是抽象类. 
类在声明中使用implements来实现某个接口. 
class Shop implements a{ 
public function b(){ 
... 



9> 异常 exception 
PHP5引入异常类 

10>拦截器 interceptor 
__get($property); 访问未定义的属性时被调用 
__set($property,$value); 给未定义的属性赋值时被调用 
__isset($property); 对未定义的属性使用isset()时被调用; 
__unset($property);对未定义的属性调用unset()时被调用; 
__call($method, $arg_array); 调用未定义的方法时候被调用 
例: __get()的实现 

复制代码代码如下:


function __get($property){ 
$method="get{$property}"; 
if(method_exists($this,$method)){ 
return $this->$method(); 



function getName(){ return "Bob";} 

function __isset($property){ 
$method="get{$porperty}"; 
return(method_exists($this, $method)); 


function __set($property, $value){ 
$method="set{$property}"; 
if( method_exists($this,$method)){ 
return $this->$method($value); 



11> 析构方法 __destruct() 

12> __clone(); 与clone关键字的区别 
class CopyMe(); 
$first= new CopyMe(); 
$second=$first; 
// PHP4 : $first和$second是两个完全不同的对象; 
// PHP5: $first和$second指向同一个对象 
PHP5中, 对象的赋值和传递都是引用. 
如果要拷贝,就要用: $second= clone $first; //现在$first和$second是两个完全不同的对象,(by_value copy) 
如果要想控制复制, 要通过实现一个特殊方法__clone() 

13> 自动加载: __autoload() 
PHP5引入__autoload()拦截器方法来自动包含类文件.当PHP遇到试图实例化一个未知类的操作时,会尝试调用__autoload()方法,并将类名当作字符串参数传递给它. 
例如一个很简单的自动定位和包含策略: 
function __autoload( $classname){ 
includ_once "$classname.php"; 


==================== 
14>使用字符串动态引用类 

复制代码代码如下:


$classname="Task"; 
require_once("tasks/{$classname}.php); 
$myObj= new $classname(); 
$method="getTitle"; 
$myObj->$method(); //动态方法 


15>类函数和对象函数 

复制代码代码如下:


class_exist(); //检查类是否存在 
get_declared_classes(); //获得当前脚本进程中定义的所有类(array形式返回) 
get_class_methods();//类中所有的public方法列表(array) 
method_exist($objname,$method); //对象或类的方法是否存在 
is_callable();//对象或类的方法不仅存在,且能访问 
get_class_vars(); // 属性 
get_parent_class(类或对象名称); //父类 
is_subclass_of(); //是否子类,不管接口,接口用 instanceof操作符 


16>反射API 
由一系列可以分析属性、方法、类和参数的内置类构成,可以动态获取信息,动态调用方法.