设为首页 收藏本站
查看: 617|回复: 0

[经验分享] php学习笔记(魔术方法的使用)

[复制链接]

尚未签到

发表于 2017-4-1 12:03:01 | 显示全部楼层 |阅读模式
  1 __construct().当实例一个对象时会先执行此方法,当子类实例化时会先执行父类的构造,这个没什么好说的和java,c#等oop语言一样。例如:

<?php
class BaseClass {
function __construct() {
print "In BaseClass constructor\n";
}
}
class SubClass extends BaseClass {
function __construct() {
parent::__construct();
print "In SubClass constructor\n";
}
}
$obj = new BaseClass();
$obj = new SubClass();
//In BaseClass constructor In BaseClass constructor In SubClass constructor
?>

  2.__destruct析构方法的概念和其他面向对象的语言(比如java(垃圾回收机制))是一样的。当指向这个对象的最后一个引用被销毁的时候,析构方法被调用,调用完成后释放内存。(先销毁父类在子类)注意:析构方法不接受任何参数。

<?php
class MyDestructableClass {
function __construct() {
print "In constructor\n";
$this->name = "MyDestructableClass";
}
function __destruct() {
print "Destroying " . $this->name . "\n";
}
}
$obj = new MyDestructableClass();
//In constructor    Destroying MyDestructableClass
?>
  3。__autoload()拦截函数在一个未声明的类被初始化的时候自动调用。该类的名字会被自动传递给__autoload()函数。而__autoload()也只有这么唯一的一个参数。

<?php
class ClassName{
public function __construct(){
echo "加载me";
}
}
?>


<?php
function __autoload($className) {
include_once $className . ".php";
}
$object = new ClassName();//加载me
?>


  4. __get传递属性的名字 并返回属性的值 __set 传递属性的名字 和新的值,两个是一般是一起使用的,不过与java中的getter setter有一点不一样,看例子

<?php
class StrictCoordinateClass{
private $arr = array('x'=>NULL,'y'=>NULL);
public function __get($property){
echo "key--------------->".$property;
echo "<br>";
if(array_key_exists($property,$this->arr)){
return $this->arr[$property];
}else{
echo "没有找到这一个属性";
}
}

public function __set($property,$value){
echo "property------------------->".$property."<br>";
echo "value---------------------->".$value."<br>";
if(array_key_exists($property,$this->arr)){
$this->arr[$property] = $value;
}else{
print "__set错误";
}
}
}
$obj = new StrictCoordinateClass();
$obj->x = 1;//进行set 赋值
echo $obj->x;//get方法取值
echo "<br>";
$obj->n = 2;
print $obj->n;
//property------------------->x
//value---------------------->1
//key--------------->x
//1
//property------------------->n
//value---------------------->2
//__set错误key--------------->n
//没有找到这一个属性
?>

  5..__call 有点像c#中的委托 传递方法的名字和一个数字索引数字 数组包含传递的参数 第一参数的索引0

<?php
class HelloWorld {
function display($count) {
for ($i = 0; $i < $count; $i++) {
print "Hello world\n";
}
return $count;
}
}
class HelloWorldDelegator {
private $obj;
function __construct() {
$this->obj = new HelloWorld();
}
function __call($method, $args) {
echo "method---------------->" . $method;
echo "<br>";
echo "args------------------>" . print_r($args, true);
//call_user_func_array("回调函数(对象,方法)",数组参数)
return call_user_func_array(array (
$this->obj,
$method
), $args);
}
}
$obj = new HelloWorldDelegator();
print $obj->display(3);
//method---------------->display
//args------------------>Array ( [0] => 3 ) Hello world Hello world Hello world 3
?>

  总结:

//php能通过实现特殊的代理方法对属性的访问和方法的调用进行重载
//function __get($property);__get 传递属性的名字 并返回属性的值
//function __set($property,$value);//传递属性的名字 和新的值
//function __call($method,$args);//传递方法的名字和一个数字索引数字 数组包含传递的参数 第一参数的索引0
//__get __set是对成员属性来说  __call 是 对方法来说


<?php
/*
* Created on 2010-8-26
*
* 魔术方法的使用
*
*/
class Test {
/*******
* @param string 属性的名称
*/
public function __get($key) {
echo $key . " 不存在";
}
/*******
* @param string 要赋值的成员变量名称
* @param string 要赋的值
*/
public function __set($key,$value){
echo "对".$key."赋值".$value;
}
/******
* @param string 方法名
* @param array 参数列表
* */
public function __call($key,$args){
echo "您要调用的 {$key} 方法不存在。你传入的参数是:" . print_r($args, true);
}
}
$t = new Test();
echo $t->name;
echo "<br>";
$t->name = "aninggo";
echo "<br>";
$t->getName("asdf","go");
//name 不存在
//对name赋值aninggo
//您要调用的 getName 方法不存在。你传入的参数是:Array ( [0] => asdf [1] => go )

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-358693-1-1.html 上篇帖子: php学习笔记(序列化应用) 下篇帖子: [转载]php程序员要注意的
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表