您的位置:首页 > 编程语言 > PHP开发

php魔术方法详解

2016-08-13 09:44 435 查看

__autoload

很多开发者写面向对象的应用程序时,对每个类的定义建立一个 PHP 源文件。一个很大的烦恼是不得不在每个脚本(每个类一个文件)开头写一个长长的包含文件的列表。

在软件开发的系统中,不可能把所有的类都写在一个PHP文件中,当在一个PHP文件中需要调用另一个文件中声明的类时,就需要通过include把这个文件引入。不过有的时候,在文件众多的项目中,要一一将所需类的文件都include进来,是一个很让人头疼的事,所以我们能不能在用到什么类的时候,再把这个类所在的php文件导入呢?这就是我们这里我们要讲的自动加载类。

在 PHP 5 中,可以定义一个 __autoload()函数,它会在试图使用尚未被定义的类时自动调用,通过调用此函数,脚本引擎在 PHP 出错失败前有了最后一个机会加载所需的类, __autoload()函数接收的一个参数,就是你想加载的类的类名,所以你做项目时,在组织定义类的文件名时,需要按照一定的规则,最好以类名为中心,也可以加上统一的前缀或后缀形成文件名,比如xxx_classname.php、classname_xxx.php以及就是classname.php等等.

本例尝试分别从 MyClass1.php 和 MyClass2.php 文件中加载 MyClass1 和 MyClass2 类

<?php

function __autoload($classname)

{
require_once $classname . '.php';
}

//MyClass1类不存在自动调用__autoload()函数,传入参数”MyClass1”
$obj  = new MyClass1();

//MyClass2类不存在自动调用__autoload()函数,传入参数”MyClass2”
$obj2 = new MyClass2();
?>


__call()

<?php
header("content-type:text/html;charset='utf-8'");

/*
__call处理调用错误

在程序开发中,如果在使用对象调用对象内部方法时候,调用的这个方法不存在那么程序就会出错,
然后程序退出不能继续执行。那么可不可以在程序调用对象内部不存在的方法时,提示我们调用的方法及使用的参数不存在,
但程序还可以继续执行,这个时候我们就要使用在调用不存在的方法时自动调用的方法”__call()”.

“__call()”方法,这个方法有2个参数,第一个参数为调用不存在的方法过程中,自动调用__call()方法时,
把这个不存在的方法的方法名传给第一个参数,第二个参数则是把这个方法的多个参数以数组的形式传进来。
*/

class Test
{

//调用不存的方法时自动调用的方法,第一个参数为方法名,第二个参数是数组参数

function __call($function_name, $args)
{

print "你所调用的函数:$function_name(参数:";

print_r($args);

print ")不存在!<br />";

}

}

//产生一个Test类的对象
$test=new Test();
//调用对象里不存在的方法
$test->demo("one", "two", "three");

__clone()

<?php
header("content-type:text/html;charset='utf-8'");

/*克隆对象
有的时候我们需要在一个项目里面,使用两个或多个一样的对象,如果你使用“new”关键字重新创建对象的话,再赋值上相同的属性,
这样做比较烦琐而且也容易出错,所以要根据一个对象完全克隆出一个一模一样的对象,是非常有必要的,而且克隆以后,两个对象互不干扰。
*/

class Person
{

//下面是人的成员属性

public $name;
public $sex;
public $age;

//定义一个构造方法参数为属性姓名$name、性别$sex和年龄$age进行赋值

function __construct($name,$sex,$age)
{
$this->name=$name;
$this->sex=$sex;
$this->age=$age;
}

//这个人可以说话的方法, 说出自己的属性
function say()
{
echo "我的名子叫:".$this->name." 性别:".$this->sex." 我的年龄是:".$this->age."<br>";
}

//对象克隆时自动调用的方法, 如果想在克隆后改变原对象的内容,需要在__clone()中重写原本的属性和方法
function __clone()
{
//$this指的复本p2, 而$that是指向原本p1,这样就在本方法里,改变了复本的属性。
$this->name="我是假的";
//$this->name="我是假的$that->name";
$this->age=30;
}

/*
public function __clone()
{    #复制方法,可在里面定义再clone是进行的操作
$this->id = 0;
$this->account = clone $this->account;    #不加这一句,account在clone是会只被复制引用,其中一个account的balance被修改另一个也同样会被修改
}
*/

}

$p1=new Person("张三", "男", 20);
$p2=clone $p1;
$p1->say();
$p2->say();

/*
上例输出:
我的名子叫:张三 性别:男 我的年龄是:20
我的名子叫:我是假的张三 性别:男 我的年龄是:30
*/

__toString()方法

<?php
header("content-type:text/html;charset='utf-8'");

/*
定义了“__toString()”方法,在直接输出对象引用的时候,就不会产生错误,而是自动调用了”__toString()”方法,
输出“__toString()”方法中返回的字符,所以“__toString()”方法一定要有个返回值(return 语句).

当我们有了__toString()时,运行程序是不会报错,会给出一个友好的提示,或者说当我们输出实例化的对象时
会运行__toString()方法,里面运行什么我们自己定义。

*/

class TestClass
{
public $foo;

public function __construct($foo) {
$this->foo = $foo;
}

//定义一个__toString方法,返加一个成员属性$foo
public function __toString() {
return $this->foo;
}
}

$class = new TestClass('Hello');

//直接输出对象
echo $class;

//如果没有__toString方法,对象是不可以被输出的,只能被打印
//Catchable fatal error: Object of class Person could not be converted to string
//类Person对象不能转换为字符串
//print_r($class);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: