Fork me on GitHub

拦截器

复制代码
class Computer{
    // 类属性 成员
    private $_name ;
    private $_cpu ;
    private $_model ;
    public function __construct()
    {
        echo "<meta charset=utf8>";
    }

    // __set() 和__get()方法私有了,还是可以执行,是因为
    //目前程序的指针已经在类内了,而类内可以执行封装的方法
    //类内执行私有方法,不会出现任何错误,
  // 但是会出现警告,对于应用程序的使用是没有任何问题的    
  // 它只需要间接的拦截就可以了,拦截是在类内执行的。根本就不需要对它类外执行
  // 避免暴露更多细节
  // 说白了,__set()和__get()是php的内置方法,具有一定的特殊性
    private function __set($name, $value)
    {
        $this->$name=$value;
    }
    private function __get($name)
    {
        return $this->$name;
    }
}
$computer1 = new Computer();
$computer1->_name = "联想";
$computer1->_cpu = "4核";
$computer1->_model = "i7";
echo $computer1->_name;
echo $computer1->_cpu;
echo $computer1->_model;
复制代码

 以下为警告信息,此处为开发模式下,将错误显示打开

常量

常量(constent)
在类中可以定义常量,用来表示不会改变的值。对于从类实例化的任何对象来说,常量值在这些对象的生命周期中保持不变。常量不在堆栈中,而在数据区中。常量建议使用大写字母
class Computer{
    const PI = 3.1415926;
}
//常量输出方法 类::常量
echo Computer::PI;

 

 静态类成员

 有时候,可能需要创建所有类实例共享的字段和方法,这些字段和方法与所有的类实例有关,但不能由任何特定对象调用。

class Computer{
    public static $_count=0;
}
echo Comoputer::$_count;

一般来说,必须将字段做成私有化,所以可能需要这么做:

 对比堆区与数据区

堆区:

 

复制代码
class Computer{
    // $_count是一个变量,存放在堆区,每一个实例化的对象都会在堆区有一个$_count变量,即堆区的变量独占
    public $_count=0;
    public function _add(){
        // $this->_count++ 相当于 $count=$count+1
        $this->_count++;
    }
}
$computer1 = new Computer();
$computer1->_add();
$computer1->_add();
$computer1->_add();
echo $computer1->_count;
echo "<br>";
$computer2 = new Computer();
$computer2->_add();
$computer2->_add();
$computer2->_add();
echo $computer2->_count;
复制代码

 

数据区(静态区):

复制代码
class Computer{
    // static 是将数据存放在了数据区,数据区是共享的区域,每个对象都可以向这里写入数据
    public static $_count=0;
    public function _add(){
        // 静态区的类外数据调用格式 类:: 变量
        // 类内可以使用 self::变量 格式
        self::$_count++;
    }
}
$computer1 = new Computer();
$computer1->_add();
$computer1->_add();
$computer1->_add();
// 类外调用数据区静态变量
echo Computer::$_count;
echo "<br>";
$computer2 = new Computer();
$computer2->_add();
$computer2->_add();
$computer2->_add();
// 类外调用数据区静态变量
echo Computer::$_count;
复制代码

堆区---栈区---数据区对比图

 

方法和成员字段,如果都在静态区,那么可以直接使用类的静态方法调用,实现成员字段的变量,而不需要实例化

复制代码
class Computer{
    // 静态成员(属性)
    public static $_count=0;
    //静态方法
    public static function _add(){
        self::$_count++;
    }
}
// 将数据存放在数据静态区
// 无需要实例化,打印变量,
Computer::$_count++;
Computer::$_count++;
Computer::$_count++;
echo Computer::$_count;
复制代码

Instansof关键字

php5有一个instansof关键字,使用这个关键字可以确定一个对象是类的实例、类的子类,还是某个特定接口,并进行相应的操作

复制代码
class Computer{}
$comoputer1 = new Computer();
$comopute1=0;
// instanceof 使用格式
//对象名称     instanceof    类名称
// 这里为了提高优先级使用了() 小括号,建议在生产环境中使用,
// 如果对象在类的实例,则返回true
// 否则返回 false
var_dump ($comoputer1 instanceof Computer);
复制代码

 

posted on   anyux  阅读(165)  评论(0编辑  收藏  举报
努力加载评论中...
点击右上角即可分享
微信分享提示