• 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虽然支持重载,但我们最好不要这么做。首先,破坏了访问封装,其次,动态的创建的属性和方法,只是为当前实例添加了这些属性方法,类的其他实例并没有这些属性和方法。

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

  • 相关阅读:
    词法分析
    HTTP学习笔记
    Servlet入门
    UDP与TCP的区别
    C语言实现血型查询系统
    Mysql的索引、回表查询及覆盖索引浅析
    ReentranLock浅析
    CAS是个什么鬼?
    synchronize和volatile 小知识点总结
    写一个简单的阻塞队列
  • 原文地址:https://www.cnblogs.com/taijun/p/3865126.html
Copyright © 2020-2023  润新知