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你再不好好学习就真的要学不完了!";
}
}