首先, __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. hdu1757 构造矩阵

    Lele now is thinking about a simple function f(x). If x < 10 f(x) = x.If x >= 10 f(x) = a0 * f ...

  2. Spark学习之路 (十一)SparkCore的调优之Spark内存模型

    摘抄自:https://www.ibm.com/developerworks/cn/analytics/library/ba-cn-apache-spark-memory-management/ind ...

  3. 每天记命令:lscpu 和 cat /proc/cpuinfo

    [1]lscpu lscpu命令,查看cpu相关的统计信息. socket 就是主板上插cpu的槽的数目,也就是可以插入的物理CPU的个数(比如上例,可以插入1个CPU). core 就是我们平时说的 ...

  4. locust 的使用

    Contents Locust这一款开源性能测试工具.然而,当前在网络上针对Locust的教程极少,不管是中文还是英文,基本都是介绍安装方法和简单的测试案例演示,但对于较复杂测试场景的案例演示却基本没 ...

  5. flask上下文全局变量,程序上下文、请求上下文、上下文钩子

    Flask上下文 Flask中有两种上下文,程序上下文(application context)和请求上下文(request context) 当客户端发来请求时,请求上下文就登场了.请求上下文里包含 ...

  6. POJ 1018 Communication System (动态规划)

    We have received an order from Pizoor Communications Inc. for a special communication system. The sy ...

  7. read 命令详解

    read 命令从标准输入中读取一行,并把输入行的每个字段的值指定给 shell 变量 语法选项 -p read –p “提示语句”,则屏幕就会输出提示语句,等待输入,并将输入存储在REPLY中 -n ...

  8. 利用vue写filter时 当传入是一个对象时注意

    vue或angular 写filter时,传入的是对象时一定注意,不能直接改变对象的值,因为在使用该filter的页面上,若传入的对象其他值发生变化,该filter也会重新运行,这样可能会报错,如下例 ...

  9. springboot打war包需要注意事项

    1. pom文件 1.1 添加servlet-api依赖: <!-- 添加servlet-api的依赖--> <dependency> <groupId>org.a ...

  10. ConvertUtils.register(new DateConverter(null), java.util.Date.class)使用

    在我们使用BeanUtils.copyProperties(dest,orig)将一个类的属性赋值给另一个类的时候 如果类中存在 Date类型的转换可能会报"no value specifi ...