PHP类,抽象类,接口,魔术常量和魔术方法学习笔记!

oop面向对象编程的特点:封装、继承、多态!

[修饰符] class 类名 [extends 父类] [implements 接口1[,接口2...]]{
【成员属性】定义变量
【成员方法】定义函数
}

魔术常量和魔术方法

//php单继承,多层继承 
//类在未实例化时,只存在静态方法和静态属性。
//call_user_func_array('回调函数名',array('函数传递的参数'));  
//echo new cat instanceof  cat ? "yes":"no";//判断一个对象是否是某个类的实例
//echo  is_a(new cat,'cat') ? "yy":"nn";//判断一个对象是否是某个类的实例
//echo is_subclass_of('b','a')?"是":"否";//如果此对象是该类的子类,则返回 TRUE
//echo get_class(new cat);//返回对象的类名
//echo  get_parent_class('b');//返回对象或类的父类名
//echo  get_parent_class(new b); //返回对象或类的父类名
//method_exists();
//function_exists();
//file_exists();
//trigger_error('错误', E_USER_ERROR);
 
 class cat{ 
      
     const A = 'HELLO,WORLD!testabc';//常量,值一经定义不可修改,子类可以覆盖父类常量 
     
     var $var = 'hello';
     public $name;   
     protected $age; //protected 外部调用要用到__get魔术方法    
     private $money;  //private 外部调用要用到__get魔术方法     
     
     public static  $num1;//调用示例:$cat = new cat; $cat::$num; // cat::$num;
     protected static $numb;//外部不可直接调用
     private static $number;//外部不可直接调用
      
     //属性和方法调用本类和父类用 $this  
     //静态属性和静态方法调用本类和父类用 self 和 parent ,或者类名
    public function  __construct($name='admin',$age=18,$money=1000000){ 
        echo "

构造函数,自动调用!

"; $i = func_num_args();//参数个数 $a = func_get_args();//参数数组 $this->name = $name; $this->age = $age; $this->money = $money; self::$num += 10; //echo cat::A;//调用常量 // echo self::A; //调用常量 //echo static::A; //调用常量 } //php的8个魔术常量 public function index(){ echo"

文件中的当前行号:".__LINE__."

"; echo"

文件的完整路径和文件名。如果用在被包含文件中,则返回被包含的文件名:".__FILE__."

"; echo"

文件所在的目录。dirname(__FILE__)如果用在被包括文件中,则返回被包括的文件所在的目录:".__DIR__."

"; echo"

小写的函数名称:".__FUNCTION__."

"; echo"

类的名称(PHP 4.3.0 新加)。自 PHP 5 起本常量返回该类被定义时的名字(区分大小写)。在 PHP 4 中该值总是小写字母的。类名包括其被声明的作用区域(例如 Foo\Bar)。注意自 PHP 5.4 起 __CLASS__ 对 trait 也起作用。当用在 trait 方法中时,__CLASS__ 是调用 trait 方法的类的名字:".__CLASS__."

"; echo"

Trait 的名字(PHP 5.4.0 新加)。自 PHP 5.4 起此常量返回 trait 被定义时的名字(区分大小写)。Trait 名包括其被声明的作用区域(例如 Foo\Bar):".__TRAIT__."

"; echo"

类的方法名(PHP 5.0.0 新加)。返回该方法被定义时的名字(区分大小写):".__METHOD__."

"; echo"

当前命名空间的名称(区分大小写):".__NAMESPACE__."

"; } /**********************属性相关魔术方法start*************************************/ //验证一个对象属性isset($this->name) 或 empty($this->name)时, //$this->name 是一个非公有属性时,自动调用此方法。 //$cat = new cat;$cat->__isset($cat->name); //$cat = new cat;isset($cat->name); public function __isset($name){ return isset($this->$name); } //当销毁一个对象属性unset($this->name), $this->name是一个非公有属性时,自动调用此方法。 //$cat = new cat;$cat->__unset($cat->name);var_dump($cat->name); //$cat = new cat;unset($cat->name);var_dump($cat->name); public function __unset($name){ unset($this->$name); } //类外部直接设置一个对象中的非公有属性时会自动调用的方法 //$cat = new cat;$cat->name = 'abc'; //$cat = new cat;$cat->__set('name','abc'); public function __set($name,$value){ return $this->$name=$value; } //非公有属性会自动调用的方法,并将属性名作为参数传进去。 //$cat = new cat; echo $cat->name ; //$cat = new cat; echo $cat->__get('name'); public function __get($name){ if(isset($this->$name)) { return $this->$name; } return null; } //自己封装方法获取私有或受保护的属性 //内部调用示例:$this->get('属性名'); //外部调用示例:$cat = new cat; $cat->get('属性名'); public function get($name){ if(isset($this->$name)) { return $this->$name; } return null; } /**********************属性相关魔术方法end*************************************/ /**********************方法相关魔术方法start*************************************/ //当调用一个不可访问方法(如未定义,或者不可见)时,__call() 会被调用 //$cat = new cat;$cat->test(1,2,3,4); //$cat = new cat;$cat->__call('test',array(1,2,3,4)); public function __call($funcName,$args){ echo "方法".$funcName."不存在!
"; echo "
";print_r($args);//数组值为传递的所有参数
     }  
     
     //当调用一个不可访问静态方法(如未定义,或者不可见)时,__callStatic() 会被调用。
     //cat::test(1,2,3,4);
     //$cat = new cat;$cat->__callStatic('test',array(1,2,3,4));
     public static function __callStatic($funcName,$args){ 
        echo  "静态方法".$funcName."不存在!
"; echo "
";print_r($args);//数组值为传递的所有参数
     }
     
     public function __clone(){
        echo "对象 clone 克隆,自动调用!";exit();
     }
     
 
     public function __wakeup(){
         return "在执行反串行化unserialize时自动调用的方法,目的是实现资源属性的打开(sleep方法关闭的资源)";
     }
     //执行串行化serialize时自动调用的方法,目的是实现资源类型的属性的关闭操作。
     //return array();
     public function __sleep(){
         
        return array();
     }
     
     
     public function __set_state($array){
        echo "当调用var_export()时,这个静态 方法会被调用"; exit();
     }
     public function __debugInfo(){
        return array(); 
     }
     
    //__invoke把对象当成函数使用的时候自动调用
    //$cat = new cat; echo $cat();  
    public function __invoke() {
        return "__invoke";
    }

     
     final public function finalfunction(){
        return "final 关键字只能用于修饰类和方法,修饰类则子类不能继承,修饰方法则不能被子类重写!";
     } 
     
    //__toString()方法:魔术方法,当我们直接要输出一个对象时,如echo $a,print $a,
    public function __toString(){
        return '这是一个对象,不允许對對象進行ehco,print...';
    }
     

    public function __destruct(){ 
        echo "

析构函数,自动调用!

"; } }

抽象类和接口


//抽象类abstract 不能实例化,只能修饰类和非私有方法,不能修饰属性
//可以有普通方法和属性,不需要子级实现,不能覆盖抽象方法,可以继承抽象类的同时添加抽象方法,
//包含了抽象方法的类必须是抽象类,继承了抽象类的"普通类"必须实现抽象类的"所有抽象方法"
//继承了抽象类的"普通类"必须实现抽象类的"所有抽象方法"
//常量区分大小写,继承抽象类的子类 可以重写 抽象类的常量
abstract class a{
   const AA ='aa';
   public $name;
   protected $age;
   private $wife;
    
   abstract public function func0() ;
   abstract protected function func1() ;
   private static  function func2(){} 
}
class b extends a{ 
   public $a;
   public function func0(){}
   protected function func1(){}
   private function func3(){} 
} 
//接口使用关键字interface来定义,接口中只能有常量与抽象方法。同抽象类相同,是更具体的抽象类
//假如一个抽象类中所有的方法都是抽象的,那么我们可以使用另外一种方式定义:接口
//接口不能有普通属性和普通方法,abstract只修饰类不修饰方法
//实现接口关键字 implements 可以一次实现多个接口,实现的类里常量不能重写 接口定义的常量  
//一次实现多个接口时,这些接口里的常量和接口方法不能重复。

interface   cc{  
const B ='bb';
     function inter();
     function cc();
}
interface dd{
   const A ='dd'; 
   function dd();
}
class c implements cc,dd{ 
   public function cc(){}
   public function dd(){}
   public function inter(){}
}



    //*自动加载"类函数"__autoload(类名): 当new 实例化一个对象时,这个类若不存在,则自动调用此函数,并将类名存入参数 
     function __autoload($className) {
        include_once $className.'.php';  
        
    } 
    
    spl_autoload_register( function($class_name){
        require_once $class_name . '.php';
    });

你可能感兴趣的:(PHP类,抽象类,接口,魔术常量和魔术方法学习笔记!)