zoukankan      html  css  js  c++  java
  • php面向对象特性二

    拦截器

    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);
  • 相关阅读:
    vue中使用ztree时报找不到init方法错的解决方案
    element-ui 自定义表单验证 , 但是不出现小红心解决方案
    iframe子页面与父页面之间通信
    GSS系列题解——最大子段和系列
    平衡树 区间树 学习
    数据结构:从入门到精通
    后缀数组
    2019元旦总结,迎接2019
    网络流+费用流 学习
    SLT学习——leafes tree扩展 【文艺平衡树】
  • 原文地址:https://www.cnblogs.com/anyux/p/8242410.html
Copyright © 2011-2022 走看看