PHP面向对象魔术方法之__get 和 __set函数

l 基本的介绍

(1) 当我们去使用不可以访问的属性时,系统就会调用__get方法.

(2) 不可以访问的属性指的是(1 . 该属性不存在 2. 直接访问了protected或者private属性)

(3) 当程序员去给不可以访问的属性直接赋值,系统就会调用__set方法

l 举例说明

需求是: 如果对象有一个成员变量是private、protectd的,我希望在在类的外部通过 : $对象名->变量名的方式来赋值和取值,怎么办?

代码如下

<?php
    header(‘content-type:text/html;charset=utf-8‘);
    //__get 和 __set

    class Monkey{
        public $name;
        protected $food;
        public function __construct($name, $food){
            $this->name = $name;
            $this->food = $food;
        }

        //魔术方法 __get
        //1. 魔术方法名字是固定,系统提供
        //2. $pro_name 是形式参数,表示属性名
        public function __get($pro_name){

//            echo ‘<br> pro_name ‘ . $pro_name;

            //做一个判断
            if(property_exists($this, $pro_name)){
                return $this->$pro_name;
            }else{
                return ‘没有该属性,无法返回!‘;
            }

        }

        //魔术方法 __set
        //1. 魔术方法名字是固定,系统提供
        //2. $pro_name 是形式参数,表示属性名, $pro_val 是属性值
        public function __set($pro_name, $pro_val){

            //echo ‘<br> $pro_name = ‘ . $pro_name . ‘ pro_val ‘ . $pro_val;
            //判断属性是否存在
            if(property_exists($this, $pro_name)){
                $this->$pro_name = $pro_val;
            }else{
                return ‘属性不存在,无法赋值‘;
            }
        }

    }

    //创建对象
    $monkey1 = new Monkey(‘妖猴‘, ‘小孩‘);

    echo ‘<br> 猴子名字是 ‘ . $monkey1->name;

    //需求
    //因为 food是不可访问的属性(protected)

    echo ‘<br> 猴子喜欢吃 ‘ . $monkey1->food;

    //修改猴子的名字和食物
    $monkey1->name = ‘猴妖‘;
    //在默认情况下,不能直接给一个protected属性赋值, 会触发
    //__set魔术方法.
    $monkey1->food = ‘桃子‘;

    echo ‘<br> 新的值是 <br>‘;
    echo ‘<br> 猴子名字是 ‘ . $monkey1->name;

    //需求:
    echo ‘<br> 猴子喜欢吃 ‘ . $monkey1->food;

原文地址:https://www.cnblogs.com/lsqbk/p/10386457.html

时间: 2024-10-22 06:20:52

PHP面向对象魔术方法之__get 和 __set函数的相关文章

PHP类中的__get()和__set函数到底有什么用?

当试图获取一个不可达变量时,类会自动调用__get. 同样的,当试图设置一个不可达变量时,类会自动调用__set. 在网站中,这两个并不是什么非用不可的函数. 例如: Class Test {     private $a = 1;     private $b = 2;     public  $c = 3;       public function  __get($vname)     {         return "you can not get";     }      

PHP面向对象 –魔术方法

__construct() 构造函数 __destruct() 析构函数 __sleep()   serialize序列化时调用 __wakeup() unserialize反序列化时调用 __clone()       检测克隆对象 属性重载的魔术方法: set,get,sset,unset __set()          当为不可访问的属性赋值时,会被自动调用 会得到两个参数,当前操作的属性名和属性值! 典型的,__set作用,用于严格控制对象结构,和批处理可以被修改的属性! __get(

PHP面向对象魔术方法基本了解

简单介绍 (1) 魔术方法都是系统提供,程序员使用即可. (2) 所有的魔术方法,前面都是以  __ 开头的 _是两个下划线. (3) 我们在自定义函数时,就不要使用 __开头了. (4) 魔术方法是在满足某个条件(一会一个一个的说明)时,有系统自动的调用. 魔术方法一览 原文地址:https://www.cnblogs.com/lsqbk/p/10386437.html

PHP面向对象魔术方法之__call函数

l 基本介绍: (1) 当我们调了一个不可以访问的成员方法时,__call魔术方法就会被调用. (2) 不可以访问的成员方法的是指(1. 该成员方法不存在, 2. 成员方法是protected或者 private) l 需求 我们就是希望,在类的外部直接调用不可访问的成员方法(private , protected). l 案例说明 <?php header('content-type:text/html;charset=utf-8'); //__call魔术方法 class Monk{ pub

php面向对象魔术方法

__construct($argv1,$argv2,-) 功能:类的构造方法,作用是初始化对象 参数:任意多个,任意类型 返回值:无 __destruct() 功能:类的析构方法,对象被销毁时被调用,作用是释放内存 参数:无 返回值:无 __get($name) 功能:当程序员试图调用一个未定义或者不可见的成员变量(属性)的时候就会调用该方法,这个时候程序试图调用的成员变量的返回值是该方法的返回值: 参数:$name为试图调用的成员变量的名称,这个参数的传递是PHP自动完成的: 返回值:类型(不

python面向对象魔术方法补充

一.描述符 在 面向对象 编程中 定义一个(没有定义方法)类:class person , 在这个类里面,有name,age, heigth, weight,等等属性, 这个类就可以看作一个对 person 的描述符,而具体的实例则是具体的“被描述物”. 而在python中,描述符本质就是一个新式类,在这个新式类中,至少实现了__get__(),__set__(),__delete__()中的一个,这也被称为描述符协议. __get__():调用一个属性时,触发 __set__():为一个属性赋

__get().__set.__isset,__unset魔术方法

一般来说,总是把类的属性定义为 private .这更符合现实的逻辑. 但是对属性的读取和赋值操作非常频繁的,因此在PHP中,预定义了两魔术方法 "__get()"用来获取私有成员属性值的,只有一个参数获取的属性名称. "__set()"用来为私有属性设值的,有两个参数,第一参数为属性名,第二个属性值. (用__set,不用我们手工去调用,它也可以做成私有的的,是在直接设置私有属性值的时候自动调用的,同样属性私有的已经被封装上了.) 以及检查属性的方法"__isset()"和

phpz中的魔术方法__call、__set、__get、__sleep、__invoke、__autoload、__construct、__destruct、__clone、__tostring、__callstatic

PHP5.3新增了一个叫做__invoke的魔术方法,这样在创建实例后,可以直接调用对象. class testClass { public function __invoke { print “hello world”; } } $n = new testClass; $n(); 执行结果为: hello world. 官方示例 class CallableClass { public function __invoke($x) { var_dump($x); } } $obj = new C

php面向对象类中常用的魔术方法

php面向对象类中常用的魔术方法 1.__construct():构造方法,当类被实例化new $class时被自动调用的方法,在类的继承中可以继承与覆盖该方法,例: //__construct() class construct{ public function __construct(){ $this->var = "this is var"; } } class con2 extends construct{ public function __construct(){ $