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

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()

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: