登录  /  注册
博主信息
博文 42
粉丝 0
评论 0
访问量 35323
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
属性重载问题
庆选的博客
原创
632人浏览过

属性重载:发生在实例化访问不存在或无权限访问属性,系统自动加载方法。

主要方法有:

public function __get($name){}            读操作

public function __set($name,$value){}  写操作

public function __isset($name){}              读操作

public function __unset($name){}           写操作


原来类中private和protected类型属性不可直接访问,需要在类中构造方法使用。

在访问这些不存在或权限限制的属性时,自动加载这些方法

作用:常用在一些权限设置用到。比如设置权限查看,设置权限修改数据


1、--在给不可访问属性赋值时,__get()会被调用。

__get()方法:这个方法用来获取私有成员属性值的,有一个参数, 参数传入你要获取的成员属性的名称,返回获取的属性值, 这个方法不用我们手工的去调用, 是在直接获取私有属性的时候自动调用的。因为私有属性已经被封装上了,是不能直接获取值的(比如:”echo $p1->name” 这样直接获取是错误的),但是如果你在类里面加上了这个方法,在使用”echo $p1->name” 这样的语句直接获取值的时候就会自动调用__get($property_name)方法,将属性name传给参数$property_name,通过这 个方法的内部执行,返回我们传入的私有属性的值。

2、--读取不可访问属性的值时,__set()会被调用。

__set()方法:这个方法用来为私有成员属性设置值的, 有两个参数,第一个参数为你要为设置值的属性名,第二个参数是要给属性设置的值,没有返回值。这个方法同样不用我们手工去调用,是在直接设置私有属性值的 时候自动调用的,同样属性私有的已经被封装上了, 如果没有__set()这个方法,是不允许的, 比如:”$this->name=’zhangsan’,这样会出错,但是如果你在类里面加上了__set($property_name, $value)这个方法,在直接给私有属性赋值的时候,就会自动调用它,把属性比如name传给$property_name, 把要赋的值”zhangsan”传给$value,通过这个方法的执行,达到赋值的目的, 为了不传入非法的值, 还可以在这个方法给做一下判断。

3、--当对不可访问属性调用 isset() 或empty() 时,__isset()会被调用。

__isset() 方法:在看这个方法之前我们看一下“isset()”函数的应用,isset()是测定变量是否设定用的函数,传入一个变量作为参数,如果传入的变量存在则传回true,否则传回false。那么如果在一个对象外面使用“isset()”这个函数去测定对象里面的成员是否被设定可不可以用它呢?分两种情况,如果对象里面成员是公有的,我们就可以使用这个函数来测定成员属性,如果是私有的成员属性,这个函数就不起作用了,原因就是因为私有的被封装了,在外部不可见。那么我们就不可以在对象的外部使用“isset()”函数来测定私有成员属性是否被设定了呢?可以,你只要在类里面加上一个“__isset()”方法就可以了,当在类外部使用”isset()”函数来测定对象里面的私有成员是否被设定时,就会自动调用类里面的“__isset()”方法了帮我们完成这样的操作,“__isset()”方法也可以做成私有的。

--当对不可访问属性调用 unset() 时,__unset会被调用。

4、__unset()方法:看这个方法之前呢,我们也先来看一下“unset()”这个函数,“unset()”这个函数的作用是删除指定的变量且传回true,参数为要删除的变量。那么如果在一个对象外部去删除对象内部的成员属性用“unset()”函数可不可以呢,也是分两种情况,如果一个对象里面的成员属性是公有的,就可以使用这个函数在对象外面删除对象的公有属性,如果对象的成员属性是私有的,我使用这个函数就没有权限去删除,但同样如果你在一个对象里面加上“__unset()”这个方法,就可以在对象的外部去删除对象的私有成员属性了。在对象里面加上了“__unset()”这个方法之后,在对象外部使用“unset()”函数删除对象内部的私有成员属性时,自动调用“__unset()”函数来帮我们删除对象内部的私有成员属性,这个方法也可以在类的内部定义成私有的。



实例

<?php

namespace _php;

class Demo
{
    protected $name;
    private $salary;
    public $counry;
    public function __construct($name,$salary)
    {
        $this->name=$name;
        $this->salary=$salary;

    }

    public function  __get($name)
    {
//        if($name==='admin'){
//            return $this->$name  ;
//        }else{
//            return '无权查看';
//        }

        return ($this->name==='admin') ? $this->$name :'无权查看';

    }

    public function  __set($name,$value)
    {
        return $this->$name =$value ;
    }
    public function __isset($name)
    {
        return isset($this->$name);
    }

    public function __unset($name)
    {
        unset($this->$name);
    }
}

$query = new Demo('admin',9000);

echo $query->salary;

echo "<hr>";
echo  $query->salary='6000';
echo "<hr>";

运行实例 »

点击 "运行实例" 按钮查看在线实例


本博文版权归博主所有,转载请注明地址!如有侵权、违法,请联系admin@php.cn举报处理!
全部评论 文明上网理性发言,请遵守新闻评论服务协议
0条评论
作者最新博文
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2024 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号

  • 登录PHP中文网,和优秀的人一起学习!
    全站2000+教程免费学