php魔术方法-----__tostring(),__invoke,__call(),__callStatic ...

###__tostring(),__invoke()




- __tostring()方法是在对象当作字符串输出时被自动调用
- __invoke()方法是在对象当作方法时被自动调用

<?php

class Tomato {
public function __tostring(){
return "string";
}
public function __invoke(){
echo "invoke";
}
} $tomato = new Tomato();
echo $tomato; //对象当作字符串输出
$tomato(); //对象当作方法

__call(),__callStatic()




- __call()实现对方法的重载
- __callStatic()实现对静态方法的重载
- implode()等价于spilt()方法

<?php

 class Tomato {
public function __call($name, $arguments){
echo '$name:'.$name.'$arguments:'.implode(", ", $arguments);
}
public static function __callStatic($name, $arguments){
echo '$name:'.$name.'$arguments:'.implode(", ", $arguments);
}
}
$tomato->runSet("Allo", "Bllo"); //类内部没有该方法,是通过__call()重载实现的
Tomato::deRunSet("Cllo", "Dllo"); //类内部没有该静态方法,是通过__callStatic()重载实现的
?>

__get(),__set()__isset(),__unset(),__empty()




- 获取对象属性时__get()被自动调用,一般用于获取私有属性
- 设置对象属性时__set()被自动调用
- isset判断是否存在该属性,empty相反
- 释放变量时__unset(),被自动调用

<?php

 class Tomato {
private $name = "火星情报局";
public function __get($name){ //参数为属性名
if(isset($name)){ //isset判断是否存在该属性,与empty相反
echo "存在";
echo $this->name;
}else{
return null;
}
}
public function __set($name, $value){ //参数为 属性名、属性值
echo $this->$name = $value; //设置属性
} public function __unset($name){ //释放属性变量时,被自动调用
echo "null";
}
}
$tomato->name; //获取元素属性
$tomato->name = "提莫队长"; //设置元素属性
unset($tomato->name); //释放变量
?>

__clone()




- __clone(),在对象被克隆时调用
- 克隆后的对象具有与原对象相同的所有属性、方法
- 克隆后的对象属性的改变不影响原对象,即互不影响
- __clone()方法内部可以设置哪些属性不必克隆,用自己设置即可

<?php

 class Tomato {
private $name = "火星情报局";
private $title = "沈梦晨";
private $data = "2016";
public function __clone(){
echo $this->name = "老坛酸菜"; //该属性不必克隆,用自己设置的
}
}
$tomato2 = clone $tomato; //克隆对象
$tomato2->data="2017"; //通过克隆对象该变属性
$tomato->name; //获取原对象属性
$tomato->title; //原对象属性
$tomato->data; //获取原对象属性,发现没有改变
$tomato2->name; //获取现对象属性
$tomato2->title; //克隆对象属性,与原对象不一样
$tomato2->data; //获取克隆对象属性,发现改变
?>
  • 综上,克隆后的对象属性的改变不影响原对象
  • 克隆的过程中,可以自己设置自己的值,没必要完全克隆(根据实际情况)

php魔术方法使用场景的更多相关文章

  1. php数组去重、魔术方法、redis常用数据结构及应用场景

    一.用函数对数组进行去重的方法 1.arrau_unique函数的作用 移除数组中重复的值. 将值作为字符串进行排序,然后保留每个值第一次出现的健名,健名保留不变. 第二个参数可以选择排序方式: SO ...

  2. PHP 类中的魔术方法

    定义: PHP类中以两个下画线“__”开头的方法被称为魔术方法. 分类: 例如:构造方法:__construct:析构方法:__destruct:动态重载:__set().__get().__call ...

  3. PHP魔术方法小结.md

    说明 魔术方法就是在特定场景下不需要调用而自动执行的方法.因为有魔术方法,所以我们的类可以写得很灵活~ __construct #构造方法,在类被实例化时自动调用,一般用于初始化操作; __destr ...

  4. PHP 魔术方法 __call 与 __callStatic 方法

    PHP 魔术方法 __call 与 __callStatic 方法 PHP 5.3 后新增了 __call 与 __callStatic 魔法方法. __call 当要调用的方法不存在或权限不足时,会 ...

  5. PHP:__get()、__set()、__isset()、__unset()、__call()、__callStatic()六个魔术方法

    哎呀呀,今天小仓鼠学到了魔术方法,简称魔法,哈哈哈哈,神经病啊~ 平时在面试的时候,也会遇到问魔术方法有哪些的问题哦!今天我们来了解一下下~ 1.__get() 形式: __get($objName) ...

  6. Python的程序结构[1] -> 方法/Method[2] -> 魔术方法 __init__ / __del__ / __new__

    魔术方法 / Magic Method 魔法方法就是可以给你的类增加魔力的特殊方法(实质应称为特殊方法,魔术方法在JavaScript中有所体现,对象具有不透明特性,而且无法在自定义对象中模拟这些行为 ...

  7. Pthon魔术方法(Magic Methods)-上下文管理

    Pthon魔术方法(Magic Methods)-上下文管理 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.上下文管理方法 __enter__: 进入与此对象相关的上下文.如果 ...

  8. Pthon魔术方法(Magic Methods)-运算符重载

    Pthon魔术方法(Magic Methods)-运算符重载 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Python运算符对应的魔术方法 1>.比较运算符 <: ...

  9. 魔术方法之__call、__callStatic

    1.__call() 作用,当调用不存在的方法时,会调用该方法.实际应用,当程序调用不存在的方法时,意外导致程序终止. .或者当你调用了受保护的或者是私人的方法时,也会自动调用__call方法 结果: ...

随机推荐

  1. Android中Listview点击item不变颜色以及设置listselector 无效

    Android中Listview点击item不变颜色以及设置listselector 无效 这是同一个问题,Listview中点击item是会变颜色的,因为listview设置了默认的listsele ...

  2. Android屏幕适配总结

    一.首先需要明白的几个概念 1.屏幕尺寸:也就是我们平常所说的某某手机几寸屏.比如苹果的4.7寸, 荣耀6的5.5寸.这里说的寸是英寸(1 英寸 = 2.54 厘米). 计算方法:屏幕尺寸=对角先尺寸 ...

  3. RunLoop-Custom input source

    Creating Creating a custom input source involves defining the following: The information you want yo ...

  4. c#设计模式介绍

    序号 模式名称 模式描述 应用场景 例子 1 单例模式 (SigletonPattern) 保证一个类仅有一个实例,并提供一个访问它的全局访问点. • 单例类只能有一个实例. • 单例类必须自己创建自 ...

  5. 正则表达式校验URL

    正则表达式: var match = /^((ht|f)tps?):\/\/([\w-]+(\.[\w-]+)*\/?)+(\?([\w\-\.,@?^=%&:\/~\+#]*)+)?$/; ...

  6. MongoDB学习笔记~为IMongoRepository接口添加了排序和表达式树,针对官方驱动

    回到目录 MongoDB的官方驱动,语法更好,更强 之前写过关于IMongoRepository仓储的文章,在mongodb的驱动选择上使用了NoRM,但是进行$ref引用类型导航时出现了问题,它对引 ...

  7. spring cron表达式

    其他参考资料 http://www.blogjava.net/hao446tian/archive/2012/02/13/369872.html http://blog.sina.com.cn/s/b ...

  8. WIN32下使用DirectSound接口的简单音频播放器(支持wav和mp3)

    刚好最近接触了一些DirectSound,就写了一个小程序练练手,可以用来添加播放基本的wav和mp3音频文件的播放器.界面只是简单的GDI,dxsdk只使用了DirectSound8相关的接口. D ...

  9. 【转载】4412开发板嵌入式QtE应用开发环境搭建

    本文转自迅为iTOP-4412开发板实战教程书籍:http://topeetboard.com QtE应用需要使用开发工具qtcreator,本文介绍qtcreator-3.2.2的安装和使用.1. ...

  10. spark streaming kafka example

    // scalastyle:off println package org.apache.spark.examples.streaming import kafka.serializer.String ...