魔术方法__get()

什么是魔术方法呢?

在PHP中以两个下划线开头的方法,被称为"魔术方法"(Magic methods)。比如之前讲过的__construct(), __destruct (), __clone(),以及__call(),,__get(), __set(),__sleep(), __wakeup(), __toString(), __autoload()等,都是魔术方法。

如果希望PHP调用这些魔术方法,首先必须在类中定义,否则PHP不会执行未创建的魔术方法。大理石构件来图加工

注意:

魔术方法是php中设置好的,所以不能自己去创建,只能用php中本来就存在的,否则会报错。

下面我们就来介绍众多魔术方法中常用的魔术方法。

__get()的作用为:

__get():读取不可访问属性的值(private,protected,不存在)时,php就会执行__get()方法。

我们来看个有关__get()的实例:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

<?php

class Monkey{

public $name;

protected $food;

function __construct($name,$food){

$this->name = $name;

$this->food = $food;

}

function sayHello(){

echo '<br/>我是' . $this->name . '我喜欢吃' . $this->food;

}

}

$monkey = new Monkey('猴子' , '桃子')

$monkey -> sayHello();

上面的实例是我们之前说过的关于类的知识,创建类,创建方法,实例化,最后访问。

下面我们提出一个新的需求,那就是我们要在类的外面直接调用$food。那么有人就会说了,$food是个保护的属性,是不能直接被调用的。但是需求就是要这么做,该怎么办呢?这时候就要用到我们的魔术方法__get()了。看下面的代码:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

<?php

class Monkey{

public $name;

protected $food;

function __construct($name,$food){

$this->name = $name;

$this->food = $food;

}

function sayHello(){

echo '<br/>我是' . $this->name . '我喜欢吃' . $this->food;

}

//魔术方法

function __get($pro_name){

//先判断$pro_name是否存在

if(isset($this -> $pro_name)){

return $this -> $pro_name;

}else{

echo '属性值不存在';

}

}

}

$monkey = new Monkey('猴子' , '桃子')

$monkey -> sayHello();

echo '猴子喜欢吃' . $monkey -> food;

在用魔术方法之前,我们需要先判断$pro_name是否存在。因为在上述例子中,$pro_name调用的是food,food是存在的,所以可以调用。但是如果将food换成别的不存在的,比如a,那么,__get()方法会被调用,但是会报错,说a不存在。所以我们要先进行判断。https://www.bzddrive.com/tag/xiaoxingzhixiandaogui_327_1.html

原文地址:https://www.cnblogs.com/furuihua/p/12156020.html