博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
PHP | 魔术方法 | __toString(),__clone(),__call(),__...
阅读量:5999 次
发布时间:2019-06-20

本文共 1707 字,大约阅读时间需要 5 分钟。

hot3.png

__toString()
如果我有一个类:
class Person
{
private $name = "";
private $age = 0;
function __construct($name = "", $age = "")
{
$this->name = $name;
$this->age = $age;
}
function say()
{
echo "name:".$this->name."<br/>"."age:".$this->age."<br/>";   
}
}
现在我去实例化这个类,然后去打印这个实例:
$p1 = new person("liuzy",20);
echo $p1;  //直接打印会出错
显然这样直接打印对象是会出现错误的,
因为对象是引用句柄,不能直接打印。这时,我们可以用到__toString()方法。我们在Person类里加一个__toString()方法:
function __toString()
{
return "I am  Person,my name is ".$this->name."<br/>";
}
然后再刷新页面,发现什么了?
现在我们明白,
__toString()是在直接打印对象时执行的方法,我们可以用该方法打印类的一些相关信息。注意:是两个下划线,
方法必须有返回值
__clone()
我们知道对象是可以直接赋值的,比如
$p2 = $p1;   //这里是一个对象有两个引用
那么我执行:
$p1->say();
$p2->say();
是都可以执行的,而且效果一样。
我们还有一种方法:
$p3 =
clone $p1;     //
注意clone是克隆关键字,这里与上面的不同是$p3是一个新的对象
同时我们在类里加入一个方法:
function __clone()
{
$this->name = "我是副本";  //
注意:这里的$this是克隆产生的对象本身,不是当前类
}
然后我们执行:
$p3->say();
打印出:
name:我是副本
age:20
到这里我们明白,_
_clone()方法是在克隆对象的时候执行的方法,它的作用是
对新克隆出来的副本
进行属性初始化等操作
__call()
这个方法的主要功能是:在该类的实例调用一个不存在的方法时,执行该__call()方法。注意需要提前在类里
声明:
function __call($fname,$argus)
{
echo "你调用的方法:".$fname."不存在<br/>";
echo "参数是".print_r($argus);
}
声明时包含两个参数,第一个参数是string型,是调用的不存在的方法的方法名($fname),第二个参数是
array型,是调用的不存在的方法的参数($argus)。
可参照文章
__autoload()
我们在平时调用一个类的时候,必须要先将该类所在的文件引入(include “xxx.php”),如果我们在一个页里调用的类很多,那么我们不得不使用许多的include “xxx.php”。显然这样很麻烦。
__autoload()方法可以帮我们解决这个问题。
比如我们将上面的那个Person类所在的文件定义为 Person_class.php  ,
再新建一个php文件  test.php,编辑内容:
function  __autoload($calssName)
{
include $className."_class.php";  //看到这也许你就明白了吧?哈哈
}
$p = new Person("mifan", 22);
$p->say();
这样执行该test.php页面就不会出现错误了。
__autoload()方法是在生命不存在的类时调用的方法,它有一个string类型的参数是声明该不存在类的类名。
当然,类文件的命名也是很有讲究的。最好是和类有关系,比如Person_class.php

转载于:https://my.oschina.net/yoyo1987/blog/159284

你可能感兴趣的文章
Android之drawable state各个属性详解
查看>>
Linux——网段的划分,子网掩码,ABC类地址的表示法
查看>>
android开发(22)使用正则表达式 。从一个字符串中找出数字,多次匹配。
查看>>
AJAX
查看>>
2015 多校联赛 ——HDU5334(构造)
查看>>
几个ES6新特性
查看>>
mysql字符集
查看>>
DP_1d1d诗人小G
查看>>
非、半、结构化数据学习【转载】
查看>>
SpringMVC之单/多文件上传
查看>>
cache-fusion笔记
查看>>
改变div属性的一个实例
查看>>
avalon加载一闪而过现象
查看>>
线段树模板【数据结构 - 线段树】
查看>>
Castle IOC概念理解
查看>>
如何配置Log4Net使用Oracle数据库记录日志
查看>>
一道在知乎很火的 Java 题——如何输出 ab【转】
查看>>
Python学习第二天-编写购物车
查看>>
AD域组策略-只显示指定的控制面板选项配置方法
查看>>
BigTable——针对结构型数据的一种分布式存储系统
查看>>