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