首先, __call是php语言自身就具有的一种语言features...,不是thinkphp的语言特征.

关于__call参考: http://love-love-l.blog.163.com/blog/static/21078304201042492356650/

php是一种若类型语言, 对变量类型没有做强制要求, 如false, 0, null, ""被认为是像等的, 所以在某些额

函数的最后,如果要进行类型区分, 要指明 参数 $strict = true

  1. __call是针对类的对象/实例而使用的, 而__callStatic是针对类的静态方法使用的;
  2. __call有两个参数, 一个是方法名称, 一个是这个方法所带的参数组成的args. 记忆这两个参数还是比较间单的,

    只要你想到, __call可以实现php的"多态", 可以根据函数名和参数的类型而调用不同的私有方法:

    就好了.
PHP5 的对象新增了一个专用方法 __call(),这个方法用来监视一个对象中的其它方法。如果你试着调用一个对象中不存在的方 法,__call 方法将会被自动调用。

<?php
class foo {
function __call($name,$arguments) {
print("Did you call me? I'm $name!"); //这里使用的是print, 而不是echo!
}
} $x = new foo();
$x->doStuff();$x->fancy_stuff();
?> 这个特殊的方法可以被用来实现“过载(overloading)”的动作,这样你就可以检查你的参数并且通过调用一个私有的方法来传递参数。 // 使用 __call 实现“过载”动作 <?php
class Magic {
function __call($name,$arguments) {
if($name=='foo') {
if(is_int($arguments[0])) $this->foo_for_int($arguments[0]);
if(is_string($arguments[0])) $this->foo_for_string($arguments[0]);
}
} private function foo_for_int($x) {
print("oh an int!");
} private function foo_for_string($x) {
print("oh a string!");
}
}
$x = new Magic();
$x->foo(3);
$x->foo("3");
?>

关于__autoload, 参考: http://www.jb51.net/article/31399.htm

为什么说__autoload是解决自动加载的问题的方案?

是因为: 如果我门在new 一个类的时候, 首先要包含这个类对应的类文件, 即require/require_once...

如果要包含/需求的 类文件比较多, 就要写多个require, 这个就显得比较繁琐.

然后, 我们就可以使用__autoload的机制, 在__autoload中, 来require所需要的类文件. 而且是在__autoload方法函数中, 实现: 能够根据类名 而自动require 类文件.

什么叫"加载"? 就是: 包含require_once类所对应的类文件...

__autoload可以实现两种方式的 自动载入 类所对应的 类文件. ...

但是在一个文件中, 只能有一个 autoload方法, 如果你的项目中有一个了 atuoload方法, 你又引用了别人的项目, 而且也包含了一个autoload方法, 那么两个方法,就冲突了, 这种情况下, 你可以将两个__autoload方法 合并成一个方法, 也可以使用 spl(standard php library),来注册多个autoload方法: spl_autoload_register...

注意spl_autoload_register方法, 里面是一个 匿名函数. 参数是 $class_name... 如同jquery中的方法一样, 使用方法还是很简单的.

重要的是: __autoload或 spl_autoload_register 都是 全局函数!!! 是放在 <?php 中的, !!! 不是放在 类定义中的 !!!


**为什么要使用 print, 而不使用echo?

因为print直观, 而且有明确的 "语义"! 而且符合程序员的使用习惯, 所以更多的使用print, 而不使用echo.

另一个区别是: print总是有返回值, 而且返回值总是1, 而echo没有返回值??


annoyance: n. 麻烦, 烦恼; 烦恼的事...

one of the biggest annoyances is having to write a long list of ...


实现文件包含, 自动载入类文件的方式有三种:

为什么下面的代码会报错, 找不到类Foo呢?

$map = array(
'Foo' => 'Foo.class.php',
); function __autoload($class_name){
if(isset($map['Foo'])){ // 是因为这里$map是局部变量, 外部的$map在这里并没有起作用, 所以$map 为空, 所以就没有包含进来!! 故而出错! 方法就是
require_once $map['Foo']; // 如同上面的图所示, 声明$map 为global变量 这样外部的$map就可以在这里可见了... }
}

php的__autoload和php的__call的更多相关文章

  1. PHP中的魔术方法:__construct, __destruct , __call, __callStatic,__get, __set, __isset, __unset , __sleep, __wakeup, __toString, __set_state, __clone and __autoload

    1.__get.__set 这两个方法是为在类和他们的父类中没有声明的属性而设计的: __get( $property ) 当调用一个未定义的属性时访问此方法: __set( $property, $ ...

  2. PHP中的魔术方法总结:__construct,__destruct ,__call,__callStatic,__get,__set,__isset, __unset ,__sleep,__wakeup,__toString,__set_state,__clone,__autoload

    1.__get.__set这两个方法是为在类和他们的父类中没有声明的属性而设计的__get( $property ) 当调用一个未定义的属性时访问此方法__set( $property, $value ...

  3. PHP中的魔术方法总结 :__construct, __destruct , __call, __callStatic,__get, __set, __isset, __unset , __sleep, __wakeup, __toStr

    PHP中的魔术方法总结 :__construct, __destruct , __call, __callStatic,__get, __set, __isset, __unset , __sleep ...

  4. PHP5中__call、__get、__set、__clone、__sleep、__wakeup的用法

    __construct(),__destruct(),__call(),__callStatic(),__get(),__set(),__isset(),__unset(),__sleep(),__w ...

  5. PHP中的11个魔术方法总结:__construct,、__destruct、__call等

    PHP中的魔术方法总结 :__construct, __destruct , __call, __callStatic,__get, __set, __isset, __unset , __sleep ...

  6. PHP中的魔术方法总结 :__construct, __destruct , __call, __callStatic,__get, __set, __isset, __unset , __sleep

    PHP中的魔术方法总结 :__construct, __destruct , __call, __callStatic,__get, __set, __isset, __unset , __sleep ...

  7. __autoload()尝试加载未定义的类

    在PHP5之前,如果需要使用一个类,只需要直接使用include/require将其包含进来即可.PHP5 以后提供了这样一个方法可以自动完成加载所需的类文件. 参见官网的例子: ./myClass. ...

  8. 【PHP面向对象(OOP)编程入门教程】23.自动加载类 __autoload()函数

    很多开发者写面向对象的应用程序时,对每个类的定义建立一个 PHP 源文件.一个很大的烦恼是不得不在每个脚本(每个类一个文件)开头写一个长长的包含文件的列表. 在软件开发的系统中,不可能把所有的类都写在 ...

  9. phpexcel引入MVC框架会导致__autoload引入类文件失败的解决办法

    Autoloader.php 的register和load方法 register方法 if (function_exists('__autoload')) { // Register any exis ...

随机推荐

  1. java基础练习

    String str = "Nothing is impossible to a willing heart"; String str2 = "No cross, no ...

  2. Sqoop 学习之路

    sqoop 基础知识和基本操作可以参考这篇博客:https://www.cnblogs.com/qingyunzong/p/8807252.html#_label3

  3. Linux基础命令---显示主机名hostname

    hostname hostname指令用于设置或者显示系统主机名,没有任何参数就会返回gethostname()函数的返回值.使用hostname指令之后,主机名会立马被修改,但是重启系统之后就失效了 ...

  4. python docopt模块详解

    python docopt模块详解 docopt 本质上是在 Python 中引入了一种针对命令行参数的形式语言,在代码的最开头使用 """ ""&q ...

  5. [转载]Oracle数据库 sql%found,sql%notfound,sql%rowcount

    sql%found,sql%notfound,sql%rowcount 在执行DML(insert,update,delete)语句时,可以用到以下三个隐式游标(游标是维护查询结果的内存中的一个区域, ...

  6. 虚拟继承C++

    C++中虚拟继承的概念 为了解决从不同途径继承来的同名的数据成员在内存中有不同的拷贝造成数据不一致问题,将共同基类设置为虚基类.这时从不同的路径继承过来的同名数据成员在内存中就只有一个拷贝,同一个函数 ...

  7. priority todo

    analyze the work about change to right spindle

  8. Could not complete request

    Could not complete request com.alibaba.dubbo.rpc.RpcException: Forbid consumer 10.254.1.26 access se ...

  9. Docker学习笔记之在开发环境中使用服务发现

    0x00 概述 服务发现应用是很多服务化系统的组成部分,所以在开发.测试环境中也就有必要配备一套服务发现体系来配合我们的开发.测试工作.在这一小节里,我们就来谈谈如何在 Docker 环境下部署服务发 ...

  10. ubuntu文件名乱码convmv和iconv

    sudo apt install convmv sudo convmv -f gbk -t utf- -r --notest /home/pm/Desktop/p Linux下两个工具convmv和i ...