① 详解php的魔术方法__get()和__set()使用介绍
先看看php官方文档的解释:
__set()
is
run
when
writing
data
to
inaccessible
properties.
__get()
is
utilized
for
reading
data
from
inaccessible
properties.
究竟用中文怎么翻译呢?
inaccessible
:n.
难达到;难接近;无法理解。
有代码有真相:
复制代码
代码如下:
<?php
error_reporting(E_ALL);
class
stu{
private
$a;
private
$b
=
0;
public
$c;
public
$d
=
0;
//这里的
private
可以用
protected
public
替代
private
function
__get($name)
{
return
123;
}
//这里的
private
也可以用
protected
public
替代
private
function
__set($name,
$value)
{
echo
"This
is
set
function";
}
}
$s
=
new
stu();
var_mp($s->a);
//output:
123
var_mp($s->b);
//output:
123
var_mp($s->c);
//output:
null
var_mp($s->d);
//output:
0
var_mp($s->e);
//output:
123
$s->a
=
3;
//output:
This
is
set
function
$s->c
=
3;
//no
output
$s->f
=
3;
//output:
This
is
set
function
?>
结果分析:
如果没有__get方法,执行
var_mp($s->a)
var_mp($s->b)
会有致命的错误
如果没有__get方法,执行
var_mp($s->e)
会有一个notice,提示没有定义属性
$e
总结:
1.
从一个难以访问的属性读取数据的时候
__get()
方法被调用
2.
向一个难以访问的属性赋值的时候
__set()
方法被调用
3.
难以访问包括:(1)私有属性,(2)没有初始化的属性
4.
__isset()
__unset()
也类似
② php魔术方法。。
在 PHP 里,将所有以 __(两个下划线)开头的类方法保留为魔术方法,所以在定义类方法时,除了上述魔术方法,建议不要以 __ 为前缀。
魔术方法的引入是对面向对象编程思想的进一步实现,重载就是通过魔术方法来实现的。
PHP 魔术方法主要有:
__construct(), __destruct(), __call(), __callStatic(), __get(), __set(), __isset(), __unset(),__sleep(), __wakeup(), __toString(), __invoke(), __set_state(), __clone() 和 __debugInfo() 等。
最常见的是__construct(), __destruct(),__get(), __set()等:
__construct和__destruct是类的构造函数和析构函数。
③ php魔术方法__tostring
__tostring()方法:在直接输出对象引用的时候,就不会产生错误,而是自动调用了__tostring()方法,输出__tostring()方法中返回的字符串
通俗来说就是 对象一般是使用print_r() 或 var_mp() 来打印访问
但对于一般闲的人来说直接 使用 echo 输出对象时,必定会报错的,原因是对象无法使用echo的。
这个时候如果想解决这个错误,咱们应该怎么操作呢?
可以很好的利用__tostring()这个魔术方法
但是切记使用__toString() 时返回值一定要使用return 来进行返回。
<?php
header("content-type:text/html;charset=utf-8");
class demo{
public $foo;
public function __construct($foo){
$this->foo=$foo;
}
//定义一个__toString()方法时,返加一个成员属性$foo
public function __toString(){
return $this->foo;
}
}
$demo=new demo('hello PHP成员');
echo $demo;
④ PHP怎么在子类用父类的魔术方法
父类的魔术方法:
function __construct()
{
echo '我是父类的构造函数(魔术方法)';
}
function __unset()
{
echo '我是父类的销毁方法(魔术方法)';
}
子类调用
function index()
{
parent::__construct();
parent::__unset();
}
输出:
我是父类的构造函数(魔术方法)
我是父类的销毁方法(魔术方法)