php魔术方法
2016-02-03 23:33
561 查看
tostring()
魔术方法“__toString()”是快速获取对象的字符串表示的最快捷方式。即当我们直接要输出一个对象时,如echo $a,print $a,那么会自动调用的此魔术方法。注意:__toString()方法必须返回一个字串类型的值。
<?php /* * 魔术方法, 只有PHP语言中存在 * * * __construct() * * __destruct() * * __set() * * __get() * * __isset() * * __unset() * * 1. 自动调用, 但不同的魔术方法,有自己的调时机 * 2. 都是以"__"开始的方法 * 3. 所有的魔术方法,方法名都是固定的 * 4. 如果不写, 就不存在, 也就没有默认的功能 * * * * __toString() * * 1. 是在直接使用 echo print printf输出一个对象引用时,自动调用这个方法 * 2. 将对象的基本信息放在__toString()方法内部, 形成自字符串返回。 * 3. __toString()方法中, 不能有参数, 而且必须返回一个字符串 */ class person{ public $name; public $age; public $sex; function __construct($name,$age,$sex){ $this->name=$name; $this->age=$age; $this->sex=$sex; } function __toString(){ return "aaaaaaaaaaaa";//天下文章一大抄!过分 } } $p=new person("zyj",21,"f"); echo $p;
克隆对象__clone()方法
有时可能需要根据一个对象完全克隆出一个一模一样的对象,而且克隆以后,两个对象互不干扰。因为对象属于引用类型,普通的“=”号属于引用赋值,所有需要“clone”来复制一份。格式: $obj = new Class();
$objectcopy=clone $obj;
魔术方法:_ _clone() 当执行clone克隆时会自动调用的方法, 主要用于解决对象中特殊属性的复制操作。
<?php * 克隆对象 * 1. 使用clone这个关键 复制了一个对象 * * * __clone()魔术方法 * * 1. 是在克隆对象时,自动调用的方法 * 2. 作用:和构造方法一样, 是对新克隆的对象进行初使化 * 3. 在这个方法中$this代表的是副本, 所以就可以给所有副本的成员初使化 */ class person{ public $name; public $age; public $sex; function __construct($name,$age,$sex){ $this->name=$name; $this->age=$age; $this->sex=$sex; } function __toString(){ return "aaaaaaaaaaaa<br>";//天下文章一大抄!过分 } function __destruct(){ echo "bbbbbbbbbbb<br>"; } } $p=new person("zyj",21,"f"); $p2=$p;//相同引用 相互改变 echo $p2; $p3=clone $p;//不同引用 不互相干扰 就算不定义,系统也给 echo $p3;
通过__call( )方法处理错误调用
当试图调用一个对象中不存在的方法时,就会产生错误。PHP提供了“__call()”这个方法来处理这种情况。即当调用一个不可访问方法(如未定义,或者不可见)时,__call()会被调用。格式:
mixed __call( string $name , array $arguments )
说明:
第一个参数$name表示方法名,
第二参数$arguments表示调用时的参数列表(数组类型)
多用于数据库调用
<?php /* * * __call() * * 1. 就是在调用一个对象中不存的方法时,自动调用的方法 * 2. 有两个参数, 第一个参数是, 调用的不存的方法的方法名, 第二个参数是,调用这个不存的方法的方法参数 * 3. 作用:可以写提示,但这个不是主要的功能。 将方法的功能相似, 但方法名还要不同的, 就可以采用这个方式来完成 * */ class Person { public $name; public $age; public $sex; public $marr = array("aaa", "bbb", "ccc", "ddd", "www"); function __construct($name, $age, $sex) { $this->name = $name; $this->age = $age; $this->sex = $sex; } function say() { echo "我的名子是:{$this->name},我的年龄是:{$this->age},我的性别是:{$this->sex}。<br>"; } function __toString() { return "aaaaaaaaaaaaaaaaaaa<br>"; } function __destruct() { echo "{$this->name} ###########<br>"; } function __clone() { $this->name="克隆的"; $this->age=0; } function __call($method, $args) { if(in_array($method, $this->marr)) {//判断调用的方法名是否在某个数组里 充分体现了php的方法名与字符串的好用啊啊啊 必须加this-> echo $args[0]."<br>"; //起到的作用和下面注释掉的一样 }else{ echo "你调用的方法{$method}()不存在!<br>"; } } /* function aaa($a) { echo $a; } function bbb($b) { echo $b; } function ccc($c) { echo $c; } function ddd($d) { echo $d; } */ } $p = new Person("张三", 10, "男"); $p -> aaa("aaaaaaaaaaa"); $p -> bbb("bbbbbbbbbbbb"); $p -> ccc("cccccccccc"); $p -> ddd("dddddddd"); $p -> www("wwwwwwwww");
对象串行化
对象也是一种在内存中存储的数据类型,他的寿命通常随着生成该对象的程序终止而终止。有时候可能需要将对象的状态保存下来,需要时再将对象恢复。对象通过写出描述自己状态的数值来记录自己,这个过程称对象的串行化(Serialization)。以下两种情况需要将对象串行化:对象需要在网络中传输时,将对象串行化成二进制串即可。
对象需要持久保存时,将对象串行化后写入文件或数据库。
串行化和反串行化函数:
serialize() -- 串行化,返回一个包含字节流的字符串unserialize() -- 反串行化,能够重新把字符串变回php原来的对象值。
串行化一个对象将会保存对象的所有属性变量和类名信息,但是不会保存对象的方法。
<?php * 串行化(序列化) * * 1. 将对象转成字符串(不用看懂) --- 串行化 * 2. 将字符串转回对象 --- 返串行化 * * * 注意(串行化的时机): * * 1. 将对象在网络中传输 * 2. 将对象持久保存 * * * * */ include "test.php";//用的还是那个person类 //对象 $p = new Person("张三", 10, "男"); //将对象串行化 $str = serialize($p); //将字符串保存在文件夹objstr.txt中 file_put_contents("objstr.txt", $str); echo "对象转完字符串, 保存到文件中成功!";
反串行化
<?php include "tostring.php"; $str=file_get_contents("objstr.txt"); $p=unserialize($str); echo $p;//我做了tostring
__sleep()、wakeup()
在串行化时自动调用。作用:可以设置需要串行化的对象的属性 只要在这个方法中返回数组,数组中声明哪个属性名,哪个属性名被串行化,默认是全部~在反串行化时自动调用 作用:对串行化回来的对象进行初始化,与clone() construct()相似
class Person { public $name; public $age; public $sex; public $marr = array("aaa", "bbb", "ccc", "ddd", "www"); function __construct($name, $age, $sex) { $this->name = $name; $this->age = $age; $this->sex = $sex; } function say() { echo "我的名子是:{$this->name},我的年龄是:{$this->age},我的性别是:{$this->sex}。<br>"; } function __toString() { return "aaaaaaaaaaaaaaaaaaa<br>"; } function __destruct() { echo "{$this->name} ###########<br>"; } function __sleep() { echo "只串行化,name和age <br>"; return array("name", "age"); } function __wakeup() { echo "返串行化时自动调用我这个方法了<br>"; $this->age = 12; }其他文件不变
json数组的串行化
可串设备、可串语言javasrcipt object
<script> var obj={name:"MissZhou",age:10}; alert(obj.name); </script>
上面这个是以php为后缀名的 ,刷新网页弹出对话框 。注意: js后面是冒号不是等于,如果出错了它不给你提示!
<?php $arr=array("name"=>"MissZhou","age"=>20); $str=json_encode($arr); echo $str;
猜猜输出是什么?
{"name":"MissZhou","age":20} 和js的结构一样哟
数组的反串行化
<?php $arr=array("name"=>"MissZhou","age"=>20); $str=json_encode($arr); echo $str;
$parr=json_decode($str,true);//加了true成数组啦
//echo $parr->name;
echo $parr['name'];
__set_state() (了解)
提前介绍两小函数<?php $arr=array("one"=>"距离春节仅剩2天","two"=>"距离开学仅剩30天","three"=>"距离找工作仅剩6个月"); var_dump($arr); echo '<br>'; $a=eval('$b='.var_export($arr,true).";"); var_dump($b); echo $b['one'];正文
var_export() 函数返回关于传递给该函数的变量的结构信息,它和 var_dump() 类似,不同的是其返回的表示是合法的 PHP 代码。var_export必须返回合法的php代码, 也就是说,var_export返回的代码,可以直接当作php代码赋值个一个变量。 而这个变量就会取得和被var_export一样的类型的值。
用var_export()输出一个对象时,__set_state()会被调用,输出内容以该魔术方法的返回值为准。
$test = new Test();
$b = var_export($test, true);
var_dump($b);
class Test {
public $a;
public static function __set_state($array) {
$ab = new Test();
$ab->a = 10;
return $ab;
}
}
当调用var_export()时,这个静态 方法会被调用(自PHP 5.1.0起有效)。
<?php class person{ public $name; public $age; public function __construct($a,$b){ $this->name=$a; $this->age=$b; } static function __set_state($arr){//导出对象信息的时候使用 $p=new person("zyj",22); return $p; } } $p=new person("MissZhou",21); eval('$b='.var_export($p,true).";"); var_dump($b);
输出:
object(person)[2] public 'name' => string 'zyj' (length=3) public 'age' => int 22
PHP 5.3以后新增的魔术方法
魔术方法__invoke()
在创建实例后,可以直接调用对象class testClass {
public function __invoke {
echo “hello world”;
}
}
$n = new testClass;
$n();
执行结果为: hello world。
魔术方法__callStatic()
它的工作方式类似于 __call() 魔术方法,__callStatic() 是为了处理静态方法调用,它必须是公共的,并且必须被声明为静态的。class A
{
public function __call($name, $args)
{
}
public static function __callStatic($name, $args)
{
}
}
自动加载类
在编写面向对象程序时,常规做法是将每一个类保存为一个PHP源文件。当在一个PHP文件中需要调用一个类时很容易就可以找到,然后通过include(或require)把这个文件引入就可以了。不过有的时候,在项目中文件众多,要一一将所需类的文件include进来,是一个很让人头疼的事。PHP5提供了一个__autoload()来解决这个问题。当new实例化一个不存在的类时,则自动调用此函数“__autoload()”,并将类名作为参数传入此函数。我可以使用这个实现类的自动加载。
在组织定义类的文件名时,需要按照一定的规则,最好以类名为中心,加上统一的前缀或后缀形成文件名:class_student.php 或 student_class.php 或 student.php
以后用的多
<?php function __autoload($classname){//唯一一个写在类外面的 只加载一次 include strtolower($classname).".class.php"; } $t=new Test(); $t->one();test.class.php
<?php class Test{ function one(){ echo "MissZhou你再不好好学习就真的要学不完了!"; } }
class_alias()为类起别名
class_exists()判断类是否存在
get_class_method()返回类中的方法名组成的数组
get_class_vars()获取除私有外的类的成员属性
get_class()返回对象的类名
get_declared_classes()返回此脚本中的所有类,而且有php自带的
get_declared_interfaces()返回……所有的接口……
get_object_vars()返回由对象属性组成的关联数组
get_parent_class()……
is_a()用instanceof代替
method_exists()
property_existd()
相关文章推荐
- phpinfo() 中 Local Value(局部变量)Master Value(主变量) 的区别
- 全新Mac配置PHP开发环境教程
- ThinkPHP - 分页
- PHP的几个常用加密函数
- PHP---语法笔记
- 是 WordPress 让 PHP 更流行了 而不是框架
- php中函数的定义,调用,及获取参数的方法。和位运算等。
- 网页的分页下标生成代码(PHP后端方法)
- PHP Cookei记录用户历史浏览信息的代码
- PHPSTORM ACTIVATION 注册激活
- php的循环与引用的一个坑
- 137 php 正则表达式2-反向引用
- PHP程序猿必须学习的第二课——站点安全问题预防
- php生成图片验证码
- ThinkPHP - 前置操作+后置操作
- PHP MYSQL单向同步方案
- ThinkPHP - 空模块+空操作
- PHP获取客户端IP地址、浏览器类型版本、操作系统
- PHP 获取指定目录下所有文件(包含子目录)
- ThinkPHP - 模板引擎