外表调用类的个人属性,PHP魔术方法

by admin on 2019年2月16日

外表调用类的民用属性

先来打听一下PHP类中的__get__set函数
当试图拿走二个不行达属性时,类会自动调用__get函数。
当试图设置2个不得达属性时,类会自动调用__set函数。

首先,来看一下__get函数,先来赢得一个可达属性试试:

<?php
    class A{
        public $a=1;
        private $b=2;
        function __get($name){
            echo 'you can get '.$name;
        }
    }
    $dy = new A();
    echo $dy->a;
?>

看一下它的回来:

1

尚无难题,没有调用__get函数,今后作者来做客一个私家的不得达属性:

<?php
    class A{
        public $a=1;
        private $b=2;
        function __get($name){
            echo 'you can get '.$name;
        }
    }
    $dy = new A();
    echo $dy->b;
?>

会发现:

you can get b

证实那里调用了__get函数,笔者再来看一下__set外表调用类的个人属性,PHP魔术方法。函数,同样也是先使用可达的public属性:

<?php
    class A{
        public $a;
        private $b;
        function __set($name,$val){
            echo 'you can get '.$name.$val;
        }
    }
    $dy = new A();
    $dy->a = 1;
    echo $dy->a;
?>

看一下输出:

1

使用成功,没不平日,接着大家来利用民用属性:

<?php
    class A{
        public $a;
        private $b;
        function __set($name,$val){
            echo 'you can get '.$name.$val;
        }
    }
    $dy = new A();
    $dy->b = 1;
    echo $dy->b;
?>

那时候看到:

you can get b1

PHP Fatal error:  Cannot access private property A::$b in /usercode/file.php on line 11

此处调用了__set函数并提示咱们不只怕使用类的私房属性。
近日来经过__set函数完结外部使用民用属性:

<?php
    class A{
        public $a;
        private $b;
        function __set($name,$val){
                $this->$name=$val;
        }
        function B(){
            echo $this->b;
        }
    }
    $dy = new A();
    $dy->b = 1;
    $dy->B();
?>

看一下出口:

1

阐明使用成功。

PHP中把以三个下划线__千帆竞发的不二法门称为魔术点子(Magic
methods),这个方法在PHP中出任了根本的作用。那里展开详细介绍,感兴趣的伴儿们可以参见一下。

当试图拿走三个不足达变量时,类会自动调用__get。

__set() __get() __isset() __unset() 多个主意的行使
貌似的话,总是把类的品质定义为private,那更符合现实的逻辑。可是,
对质量的读取和赋值操作是老大频仍的,由此在PHP5中,预约义了三个函数”__get()”和”__set()”来收获和赋值其性格,以及检查属性的”__isset()”和删除属性的方法”__unset()”。

bf88必发唯一官网 1

同一的,当试图设置壹个不足达变量时,类会自动调用__set。

上一节中,大家为每一种属性做了安装和得到的艺术,在PHP5中给我们提供了专门为属性设置值和获取值的方式,”__set()”和“__get()”那多少个章程,那两个章程不是暗许存在的,
而是大家手工添加到类里面去的,像构造方法(__construct())一样,
类里面添加了才会设有,可以按下边的形式来添加这么些主意,当然也得以按个人的作风来添加:

(好想插入一首音乐)

在网站中,那七个并不是怎么非用不可的函数。

 代码如下

特征:

1. __八个下划线先导

2. 不要求显示的调用,由一些原则下接触(类似数据库中的隐式触发器)

bf88必发唯一官网 2

接下去大家开首正文喽

咳咳,排排坐好,知识点来了!!!

 

//__get()方法用来拿到个人属性  
function __get($property_name)  
{  
    if(isset($this->$property_name)) {  
        return($this->$property_name);  
    }else {  
        return(NULL);  
    }  
}   
 
//__set()方法用来设置个人属性  
function __set($property_name, $value)  
{  
    $this->$property_name = $value;  

1. __construct( ) 构造函数

php中构造方法是目的创设完结后先是个被对象活动调用的艺术。在各种类中都有贰个构造方法,如若没有显得地宣称它,那么类中都会默许存在2个没有参数且内容为空的构造方法。

平凡构造方法被用来执行一些实用的开首化职分,如对成员属性在创立对象时给予开头值。

例子:

bf88必发唯一官网 3

$Person3 = new Person(“李四”,”男”,25);

echo $Person3->say(); //输出:我叫:李四,性别:男,年龄:25

例如:

//__get()方法用来得到个人属性
function __get($property_name)
{
    if(isset($this->$property_name)) {
        return($this->$property_name);
    }else {
        return(NULL);
    }
}

2. __destruct( ) 析构函数

通过上边的讲授,以往我们曾经清楚了怎么叫构造方法。那么与构造方法对应的就是析构方法。析构方法允许在销毁1个类在此之前实施的局地操作或完结部分效果,比如说关闭文件、释放结果集等。

析造方法的扬言格式与构造方法 __construct()
比较接近,也是以多少个下划线初阶的办法 __destruct()
,那种析构方法名称也是固定的。一般的话,析构方法在PHP中并不是很常用,它属类中可挑选的一部分,平时用来完毕部分在目的销毁前的清理任务。

例子:

bf88必发唯一官网 4

本身觉着作者还足以再抢救一下,作者的名字叫小明

Class Test
{
    private $a = 1;
    private $b = 2;
    public  $c = 3;

    public function  __get($vname)
    {
        return "you can not get";
    }

    public function __set($vname,$value)
    {
        echo  "you can not set";
    }
}

$t = new Test;

echo $t->a;//这里试图要打印出私有变量
$t->b=3;//这里试图要把私有变量进行设置

//__set()方法用来安装个人属性
function __外表调用类的个人属性,PHP魔术方法。set($property_name, $value)
{
 $this->$property_name = $value;
}__

3. __get( ) 得到3个类的分子变量时调用

在 php 面向对象编程中,类的积极分子属性被设定为 private
后,即便大家准备在外场调用它则会出现“不大概访问有些私有属性”的失实。那么为了缓解这几个题材,我们得以行使魔术点子
__get()。

在程序运转进度中,在类外部得到 访问类中个人 受体贴的品质的时候才会被调用

例子:

bf88必发唯一官网 5

姓名:小明

年龄:50

想要直接对个体变量操作,当然是做不到的。

get() 方法:那么些措施用来获取个人成员属性值的,有贰个参数,
参数传入你要博取的成员属性的称号,再次来到获取的属性值,
这一个方法毫无我们手工的去调用,
是在一向拿到个人属性的时候自动调用的。因为个人属性已经被封装上了,是不可以一向拿走值的(比如:”echo
$p1->name”
那样直接拿到是荒唐的),然则一旦你在类里面添加了这一个艺术,在接纳”echo
$p1->name”
那样的言辞直接得到值的时候就会自动调用__get($property_name)方法,将质量name传给参数$property_name,通过这些格局的其中实施,重回我们传入的村办属性的值。

4. __set( ) 设置3个类的成员变量时调用

__set( $property, $value )` 方法用来设置个人属性,
给一个未定义的天性赋值时,此方法会被触发,传递的参数是被设置的属性名和值。

例子:

bf88必发唯一官网 6

自身叫小红,二〇一九年拾陆虚岁了

于是在读取的时候,调用__get(),输出“you can not get”;

__set()
方法:那么些点子用来为私家成员属性设置值的,有五个参数,第2、个参数为您要为设置值的属性名,第一个参数是要给属性设置的值,没有重回值。这一个格局一致不用大家手工去调用,是在直接设置个人属性值的时候自动调用的,同样属性私有的已经被封装上了,
尽管没有__set()这些形式,是不允许的, 比如:”$this->name=’zhangsan’
, 那样会出错,不过若是您在类里面添加了__set($property_name,
$value)这么些措施,在直接给个人属性赋值的时候,就会活动调用它,把质量比如name传给$property_name,
把要赋的值”zhangsan”传给$value,通过这些主意的施行,达到赋值的目的,
为了不扩散非法的值, 仍是可以在这些艺术给做一下论断。代码如下:

5. __isset( ) 当对不可访问属性调用isset( )

在看那几个艺术以前大家看一下isset()函数的采纳,isset()是测定变量是不是设定用的函数,传入三个变量作为参数,如若传入的变量存在则传出true,否则传回false。

在类外 用isset方法来判断类中个人/受保险的习性存在时候

例子:

bf88必发唯一官网 7

1 // public 得以 isset()
当在类外部使用isset()函数测定私有成员name时,自动调用 // __isset()
内 第一个echo 1 // __isset() 第1个echo
在类外部使用isset()函数测定私有成员age时,自动调用 // __isset() 内
第一个echo 1 // __isset() 内第1个echo

在设置的时候,调用__set(),输出“you can not set”。

 

6. __bf88必发唯一官网 ,unset( ) 当对不可访问属性调用unset( )时被调用

看这几个办法从前呢,我们也先来看一下 unset()
函数,unset()那个函数的效益是去除指定的变量且传回true,参数为要去除的变量。在类外对类中的私有/受保障的性质销毁的时候
会自动执行__unset 魔术点子

例子:

bf88必发唯一官网 8

当在类外部使用unset()函数来删除私有成员时自动调用的

bf88必发唯一官网 9

你们有没有学会呀!

                             大家点点关注和喜欢好不好;

bf88必发唯一官网 10

自个儿不管,作者要关切

 

 代码如下

附带提一下,__get()和__set()函数要安装为public,要不然会Warning。

class Person  
{  
    //下边是人的积极分子属性, 都以包装的个人成员  
    private $name;  //人的名子  
    private $sex;    //人的性别  
    private $age;    //人的年龄  
 
    //__get()方法用来获取个人属性  
    function __get($property_name)  
    {  
        echo
“在一贯得到个人属性值的时候,自动调用了这些__get()方法<br>”;  
        if(isset($this->$property_name)) {  
            return($this->$property_name);  
        }else {  
            return(NULL);  
        }  
    }   
 
    //__set()方法用来安装个人属性  
    function __set($property_name, $value)  
    {  
        echo
“在平昔设置个人属性值的时候,自动调用了那么些__set()方法为私有总体性赋值<br>”;  
        $this->$property_name = $value;  
    }  
}  
 
$p1=new Person();  
 
//直接为私有总体性赋值的操作, 会自动调用__set()方法进行赋值  
$p1->name=”张三”;  
$p1->sex=”男”;  
$p1->age=20;  
 
//直接获取个人属性的值, 会自动调用__get()方法,重回成员属性的值  
echo “姓名:”.$p1->name.”<br>”;  
echo “性别:”.$p1->sex.”<br>”;  
echo “年龄:”.$p1->age.”<br>”; 

__get()和__set()函数定义时的参数分别为三个和一个,不管函数中到底有没用,都以不可省略的。

class Person
{
    //上面是人的成员属性, 都是包装的私有成员
    private $name;  //人的名子
    private $sex;    //人的性别
    private $age;    //人的年龄

 

    //__get()方法用来拿到个人属性
    function __get($property_name)
    {
        echo
“在直接得到个人属性值的时候,自动调用了这些__get()方法<br>”;
        if(isset($this->$property_name)) {
            return($this->$property_name);
        }else {
            return(NULL);
        }
 }

由此改动__get()和__set()函数内部的说话,就可以实以往外部调用类的个体变量。

    //__set()方法用来设置个人属性
    function __set($property_name, $value)
    {
        echo
“在一向设置个人属性值的时候,自动调用了那些__set()方法为私有总体性赋值<br>”;
        $this->$property_name = $value;
    }
}

例如:

$p1=new Person();

private __get($vname)
{
    return $this->$vname;
}

//直接为私有品质赋值的操作, 会自动调用__set()方法开展赋值
$p1->name=”张三”;
$p1->sex=”男”;
$p1->age=20;

只要$vname的值是a,那么就赶回了天经地义的值。

//间接拿到个人属性的值, 会自动调用__get()方法,再次回到成员属性的值
echo “姓名:”.$p1->name.”<br>”;
echo “性别:”.$p1->sex.”<br>”;
echo “年龄:”.$p1->age.”<br>”;

__set()也同理。

程序执行结果:
在间接设置个人属性值的时候,自动调用了那个__set()方法为私有总体性赋值
在平素设置个人属性值的时候,自动调用了这一个__set()方法为私有品质赋值
在直接设置个人属性值的时候,自动调用了这几个__set()方法为私有总体性赋值
在一贯拿走个人属性值的时候,自动调用了这几个__get()方法
姓名:张三
在直接获取个人属性值的时候,自动调用了那么些__get()方法
性别:男
在一向拿到个人属性值的时候,自动调用了这些__get()方法
年龄:20

public function __set($vname,$value)
{
    $this->$vname = $value;
}

如上代码如果不增加__get()和__set()方法,程序就会出错,因为无法在类的外部操作私有成员,而地点的代码是经过机关调用__get()和__set()方法来协理大家直接存取封装的私家成员的。

 

__isset() 方法:在看那个法子以前大家看一下 isset() 函数的利用,isset()
是测定变量是还是不是设定用的函数,传入1个变量作为参数,假若传入的变量存在则传出
true,否则传回 false。


么尽管在一个目的外面使用“isset()”这几个函数去测定对象里面的成员是或不是被设定可不得以用它呢?分二种状态,若是目的里面成员是国有的,我们就足以
使用那几个函数来测定成员属性,如若是私有的分子属性,那一个函数就不起成效了,原因就是因为个人的被包裹了,在表面不可知。那么大家就不得以在目的的外表使
用“isset()”函数来测定私有成员属性是不是被设定了啊?可以,你只要在类里面添加一个“__isset()”方法就足以了,当在类外部使用
“isset()”函数来测定对象里面的民用成员是还是不是被设定时,就会自动调用类里面的“__isset()”方法了帮大家已毕如此的操
作,“__isset()”方法也得以做成私有的。你可以在类里面添加下边那样的代码就能够了:

 

 代码如下

private function __isset($nm)  
{  
    echo “当在类外部使用isset()函数测定私有成员$nm时,自动调用”;  
    return isset($this->$nm);  

private function __isset($nm)
{
 echo “当在类外部使用isset()函数测定私有成员$nm时,自动调用”;
 return isset($this->$nm);
}

__unset()
方法:看那些办法此前呢,大家也先来看一下“unset()”那一个函数,“unset()”
这几个函数的职能是剔除指定的变量且传回true,参数为要删减的变量。那么一旦在一个对象
外部去删除对象内部的分子属性用“unset()”函数好如故不好吗,也是分二种状态,借使一个对象里面的分子属性是国有的,就能够采取那么些函数在目的外面删除对象的国有属性,借使对象的成员属性是个人的,小编利用那些函数就从不权力去删除,但同样假设您在一个目的里
面加上“__unset()”那个主意,就足以在目的的表面去删除对象的村办成员属性了。在对象
里面添加了“__unset()”这几个办法之后,在对象外部使用“unset()”函数删除对象内部的私有
成员属性时,自动调用“__unset()”函数来帮大家删除对象内部的私家成员属性,那些法子也可以在类的里边定义成私有的。在对象里面添加上面的代码
就足以了:

 

 代码如下

private function __unset($nm)  
{  
    echo “当在类外部使用unset()函数来删除私有成员时自动调用的”;  
    unset($this->$nm);  

private function __unset($nm)
{
 echo “当在类外部使用unset()函数来删除私有成员时自动调用的”;
 unset($this->$nm);
}我们来看1个完全的实例:

class Person  
{  
    // 下边是人的分子属性  
    private $name; // 人的名字  
    private $sex; // 人的性别  
    private $age; // 人的年华  
    //__get()方法用来赢得个人属性  
    private function __get($property_name)  
    {  
        if (isset($this->$property_name)) {  
            return($this->$property_name);  
        } else {  
            return(NULL);  
        }  
    }  
    // __set()方法用来设置个人属性  
    private function __set($property_name, $value)  
    {  
        $this->$property_name = $value;  
    }  
    // __isset()方法  
    private function __isset($nm)  
    {  
        echo “isset()函数测定私有成员时,自动调用”;  
        return isset($this->$nm);  
    }  
    // __unset()方法  
    private function __unset($nm)  
    {  
        echo “当在类外部使用unset()函数来删除私有成员时自动调用的”;  
        unset($this->$nm);  
    }  
}  
$p1 = new Person();  
$p1->name = “this is a person name”;  
//
在行使isset()函数测定私有成员时,自动调用__isset()方法帮我们已毕,重回结果为true  
echo var_dump(isset($p1->name)) . “”;  
echo $p1->name . “”;  
//
在采纳unset()函数删除私有成员时,自动调用__unset()方法帮大家已毕,删除name私有总体性  
unset($p1->name);  
// 已经被剔除了, 所那行不会有出口  
echo $p1->name; 

class Person
{
 // 下边是人的成员属性
 private $name; // 人的名字
 private $sex; // 人的性别
 private $age; // 人的年纪
 //__get()方法用来赢得个人属性
 private function __get($property_name)
 {
  if (isset($this->$property_name)) {
   return($this->$property_name);
  } else {
   return(NULL);
  }
 }
 // __set()方法用来安装个人属性
 private function __set($property_name, $value)
 {
  $this->$property_name = $value;
 }
 // __isset()方法
 private function __isset($nm)
 {
  echo “isset()函数测定私有成员时,自动调用”;
  return isset($this->$nm);
 }
 // __unset()方法
 private function __unset($nm)
 {
  echo “当在类外部使用unset()函数来删除私有成员时自动调用的”;
  unset($this->$nm);
 }
}
$p1 = new Person();
$p1->name = “this is a person name”;
//
在选拔isset()函数测定私有成员时,自动调用__isset()方法帮我们做到,再次来到结果为true
echo var_dump(isset($p1->name)) . “”;
echo $p1->name . “”;
//
在行使unset()函数删除私有成员时,自动调用__unset()方法帮大家做到,删除name私有品质
unset($p1->name);
// 已经被删除了, 所那行不会有出口
echo $p1->name;输出结果为:

isset()函数测定私有成员时,自动调用  
bool(true)  
this is a person name 

isset()函数测定私有成员时,自动调用
bool(true)
this is a person name当在类外部使用unset()函数来删除私有成员时自动调用的
__set()、__get()、__isset()、__unset()

那多个办法都以我们抬高到对象里面的,在急需时自动调用的,来成功在目标外部对目标内部私有属性的操作

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图