• 面向对象PHP面向对象的特性


     1.类和公有化

    class Computer {

        //什么叫做类内,就是创建类的花括号内的范围叫做类内,其他地方则类外。
        //public 是对字段的公有化,这个字段类外即可访问,赋值和取值
        public $name = '联想';
      }
      $computer = new Computer();
      $computer -> name = 'Dell';
      echo $computer->name;
    2.访问私有字段
      class Computer {
        private $name = '联想';
        //这个时候我采用一个公共对外的方法来访问私有字段
        //因为私有字段只能在类内访问,而对外的公共方法是类内的。
        //更而公共方法又是公共的,所以类外又可访问。
        public function run(){
          //字段在类内调用的时候必须是类 -> 字段,而$_name只是一个普通变量而已。
          //字段在类外调用的方法是对象 -> 字段,而类内就必须使用 Computer -> _name
          //但是在本类中,可以使用一个关键字来代替字来代替 Computer ,那就是 $this
          echo $this ->name;
        }
      }
      $computer = new Computer();
      $computer -> run();
    3.私有字段访问 .不能直接对类内的私有字段赋值,不然会报错。如:$a =new Computer(); $a->name="baocuo";
    class Computer {
        private $name;
        private $model;
        private $cpu;
        private $keyboard;
        private $show;
        private $zb;
        //必须写个对外的入口,才可以取到
        public function getName() {
          return $this->name;
        }
        //必须写一个对内的入口,对私有字段进行赋值
        public function setName($name) {
          //这里的 $name 只是一个变量而已,参数而已
          //$this->name 才是类的字段
          $this->name = $name;
        }
      }
      $computer = new Computer ();
      echo $computer->getName(); //输出是空白的。
      $computer->setName('Dell');
      echo $computer->getName();
    4.私有字段,拦截器赋值和取值
     //PHP有如下几个拦截器:
    //1、__get($property)
    //功能:访问未定义的属性时被调用在给不可访问属性赋值时
    //2、__set($property, $value)
    //功能:给未定义的属性设置赋值时被调用
    //3、__isset($property)
    //功能:对未定义的属性调用isset()时被调用
    //4、__unset($property)
    //功能:对未定义的属性调用unset()时被调用
    //5、__call($method, $arg_array)
    //功能:调用未定义的方法时被调用
     //当类外的对象直接调用私有字段时,会报错。但可以先跟去检查是否有拦截器。如果直接对$name直接赋值,会先经过拦截器_set(),功能,未定义的属性被赋值时被调用。

    __get()方法:这个方法用来获取私有成员属性值的,有一个参数,参数传入你要获取的成员属性的名称,返回获取的属性值。如果成员属性不封装成私有的,对象本身就不会去自动调用这个方法。

    __set()方法:这个方法用来为私有成员属性设置值的,有两个参数,第一个参数为你要为设置值的属性名,第二个参数是要给属性设置的值,没有返回值。(key=>value)

     
      class Computer {
        private $_name;
        private $_model;
        private $_cpu;
        //当类外的对象直接调用私有字段时,会跟着去检查是否有拦截器,
        //如果直接对 $_name 进行赋值,那么__set 方法就会拦截住,就不会报错了。
        //采用拦截器进行赋值和取值
        //赋值
        private function __set($_key,$_value){
          //采用$_key = '_name',那么 $_value = '联想';
          //$this ->_name = '联想';
          $this ->$_key = $_value;
        }
        //取值
        private function __get($_key){
          return $this -> $_key;
          //如果 $_key = '_name' 那么 $this -> _name;
          //如果 $_key = '_cpu' 那么 $this -> _cpu;
          //如果 $_key = '_model' 那么 $this -> _model;
        }
      }
      $computer = new Computer ();
      $computer->_name = '联想';
      $computer->_cpu = '四核';
      $computer->_model = 'i7';
      echo $computer->_name;.//当我们调用对象$computer 未定义的属性_name时,没有定义这个属性时或者属性是私有字段,调用拦截器__get()方法
      echo $computer->_cpu;
      echo $computer->_model;
     
    5、static 静态
     
    普通方法,存放类内,只有一份
    静态方法,也是存放于类内,只有一份
     区别在于:普通方法需要对象去调用,需要绑定$this
    即,普通方法,必须要有对象,然后让对象来调用
     而静态方法,不属于哪一个对象,因此不需要绑定$this
    即,不需要对象也可以调用
    静态属性不需要实例化就可以直接使用,在类还没有创建时就可以直接使用。

    使用的方式是: 类名::静态属性名     exp:  echo  human::$head;
     
     
    class Human{
      static public $head=1;
      public function easyeat(){
        echo '普通方法<br />';
      }
      static public function eat(){
        echo '静态方法<br />';
      }
      public function intro(){
        echo $this->name;
      }
    }

    Human::eat();
    /*
    以下方法easyeat是一个非静态方法,就由对象来调用,但,用类来调用此方法来也可以执行,而严格状态下,此方法会执行,同时报错,
     
     
    */
    Human::easyeat();
    /*
    接上,从逻辑来理解,如果用类名静态调用非静态(普通)方法
    比如:intro()
    那么,这个$this是指哪个对象呢??
    因此会报错,因为找不到对象!

    Human::intro();
     
    /*
    如上分析,其实,非静态方法,是不能由类名静态调用的,但目前,php中的面向对象检测不够严格,只要静态方法中没有$this关键字,就会转化成静态方法来处理!
    */
    $li=new Human();
    $li->eat();
     
    /*
    总结:
    类》访问->静态方法(类的方法)->可以  Human::eat();
    类》访问->普通方法(对象的方法)->不可以(虽然方法里不用$this关键字时,可以!但不支持这种写法)
     
    对象》访问》静态方法(类的方法)->可以  
    $li=new Human();
    $li->eat();
    对象》访问》普通方法(对象的方法)->可以
     
    $li=new Human();
    $li->easyeat();
    */
     
    class Human{
     static public $name = "小";
     public $height = 180;
     static public function tell(){
     echo self::$name;//静态方法调用静态属性,使用self关键词
     //echo $this->height;//错。静态方法不能调用非静态属性
    //因为 $this代表实例化对象,而这里是类,不知道 $this 代表哪个对象
     }
     public function say(){
     echo self::$name . "我说话了";
     //普通方法调用静态属性,同样使用self关键词
     echo $this->height;
     }
    }
    $p1 = new Human();
    $p1->say();
    $p1->tell();//对象可以访问静态方法
    echo $p1::$name;//对象访问静态属性。不能这么访问$p1->name
    //因为静态属性的内存位置不在对象里
    Human::say();//错。say()方法有$this时出错;没有$this时能出结果
    //但php5.4以上会提示
     
     (1)、静态属性不需要实例化即可调用。因为静态属性存放的位置是在类里,调用方法为"类名::属性名";
    (2)、静态方法不需要实例化即可调用。同上
    (3)、静态方法不能调用非静态属性。因为非静态属性需要实例化后,存放在对象里;
    (4)、静态方法可以调用非静态方法,使用 self 关键词。php里,一个方法被self:: 后,它就自动转变为静态方法;
     
    6.子类,父类
     class Computer {
        public $_name = '联想';
        public function _run(){
          echo '联想在运行!';
        }
      }
      class NoteComputer extends Computer {
     
        
        }
      }
      $noteComputer = new NoteComputer();
      echo $noteComputer -> _name;
      $noteComputer -> _run();   直接继承
     
     
       class Computer {
        //私有化,但是无法被子类继承,这个时候就应该用受保护的修饰符来封装
        protected $_name = '联想';
        protected function _run(){
          return '联想在运行!';
        }
      }
      class NoteComputer extends Computer {
        public function getTop() {//私有化继承父类
          echo $this->_name;
          echo $this->_run();
        }
      }
      $noteComputer = new NoteComputer();
      $noteComputer -> _run();
  • 相关阅读:
    jquery.js 一个非常不错的本脚库。
    AjaxPro 框架学习 (支持vs2003/vs2005)
    利用HttpResponse来导出excel文件.
    一个比较好的WEB时间控件
    CCR 编写一个不用创建线程,不用考虑资源互斥的多线程程序
    页面优化 .net 版
    [转]window.opener用法
    导出excel文件 解决科学计数法问题
    抽象类和抽象方法的特征和用途
    超强悍的右键菜单
  • 原文地址:https://www.cnblogs.com/keta/p/6122972.html
Copyright © 2020-2023  润新知