首先, __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. AngularJs ng-change事件/指令(转)

    from:http://blog.csdn.net/u011127019/article/details/52564111 定义和用法 ng-change 指令用于告诉 AngularJS 在 HTM ...

  2. 【Hive学习之七】Hive 运行方式&权限管理

    环境 虚拟机:VMware 10 Linux版本:CentOS-6.5-x86_64 客户端:Xshell4 FTP:Xftp4 jdk8 hadoop-3.1.1 apache-hive-3.1.1 ...

  3. FastDFS:Java客户都实现文件的上传、下载、修改、删除

    客户端版本:fastdfs_client_v1.24.jar 配置文件 connect_timeout = 200 network_timeout = 3000 charset = UTF-8 htt ...

  4. 字符编码几个缩写 ACR CCS CEF CES TES

    摘自https://zhuanlan.zhihu.com/p/27012967 5. 在Unicode Technical Report (UTR统一码技术报告) #17<UNICODE CHA ...

  5. ext2文件系统的运行—superblock/inode/block

    鸟哥私房菜书上内容: superblock:记录此 filesystem 的整体信息,包括inode/block的总量.使用量.剩余量, 以及文件系统的格式与相关信息等:inode:记录文件的属性,一 ...

  6. python内置函数zip

    zip() 函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表. 如果各个迭代器的元素个数不一致,则返回列表长度与最短的对象相同,利用 * 号操作符,可以 ...

  7. Node.js中环境变量process.env详解

    Node.js中环境变量process.env详解process | Node.js API 文档http://nodejs.cn/api/process.html官方解释:process 对象是一个 ...

  8. tomcat9 性能调优

    官网最靠谱 tomcat 参数官网: http://tomcat.apache.org/tomcat-7.0-doc/config/http.html   <Connector   port=& ...

  9. 深入理解Node.js基于事件驱动的回调

    回调和异步调用的关系 首先明确一点,回调并非是异步调用,回调是一种解决异步函数执行结果的处理方法.在异步调用,如果我们希望将执行的结果返回并且处理时,可以通过回调的方法解决.为了能够更好的区分回调和异 ...

  10. python02

    # 字符串学习第二天 # 1.练习len与range for的使用 test=input("请输入") l=len(test) for i in range(0,l): print ...