欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  后端开发

魔术方法__get()实例详解(php面向对象高级教程2)

程序员文章站 2022-04-11 14:03:26
...
看到这个名字,是不是有种很高级的感觉。没错,魔术方法确实很高级。

那么,什么是魔术方法呢?

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

如果希望PHP调用这些魔术方法,首先必须在类中定义,否则PHP不会执行未创建的魔术方法。

注意:

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

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

__get()的作用为:

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

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

<?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()了。看下面的代码:

<?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不存在。所以我们要先进行判断。

以上就是魔术方法__get()实例详解(php面向对象高级教程2)的详细内容,更多请关注其它相关文章!