面向对象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();
原文地址:https://www.cnblogs.com/keta/p/6122972.html