zoukankan      html  css  js  c++  java
  • php 访问控制和重载

    一     php 类中定义的private/protected属性,类外部是无法访问的,但是 我们可以通过public方法来访问设置这些属性

    如下

    <?php
    class test{
    	private $a = 1;
    	
    	public function get(){
    		return $this->a;
    	}
    	
    	public function set(){
    		$this->a = 2;
    	}
    }
    
    $m = new test();
    echo $m->get();
    $m->set();
    var_dump($m);
    
    ?>
    

      我们可以通过公共的方法访问,设置private属性的值。

    二  上面定义的公共方法调用时,必须显式的调用,给出方法名。但是对于可直接访问的属性,我们不需要使用这些方法,直接$m->属性即可。

    这里面就存在不同访问控制的属性使用不同的方法 来访问/设置。那么有没有统一的操作接口,使得 我们无论访问类中的public/private/protected属性,都是一致的方法呢?

    __set()/__get()方法提供了这种方便

    __set()设置不存在的或者不可访问的属性时,自动调用。

    __get()访问不存在或者不可访问的属性时,自动调用。

    <?php
    class test{
    	private $a = 1;
    	
    	public function __get($a){
    		if(isset($this->$a)){
    			return $this->$a;
    		}else{
    			return '不存在的属性';
    		}
    		
    	}
    	
    	public function __set($name,$value){
    		$this->$name = $value;
    	}
    }
    $m = new test();
    echo $m->b;
    $m->a=2;
    $m->b=10;
    var_dump($m);
    ?>
    

      通过在类中实现__set()/__get(),实现了对属性访问的统一操作。

    三  : php重载。php重载不同于 java重载,php重载 是指动态的创建类的属性 和方法。__get()/__set()方法就被归到了重载里。

    个人觉得,php虽然支持重载,但我们最好不要这么做。首先,破坏了访问封装,其次,动态的创建的属性和方法,只是为当前实例添加了这些属性方法,类的其他实例并没有这些属性和方法。

    纯属个人见解,欢迎批评指正

  • 相关阅读:
    P4097 [HEOI2013]Segment 李超线段树
    P3592 [POI2015]MYJ
    P3698 [CQOI2017]小Q的棋盘
    P4098 [HEOI2013]ALO 可持久化01Trie
    P2331 [SCOI2005]最大子矩阵
    P4099 [HEOI2013]SAO
    loj #6032. 「雅礼集训 2017 Day2」水箱 线段树优化DP转移
    CF765F Souvenirs 离线+线段树+主席树
    CF1097D Makoto and a Blackboard
    loj #6570. 毛毛虫计数
  • 原文地址:https://www.cnblogs.com/taijun/p/3865126.html
Copyright © 2011-2022 走看看