PHP 范围解析操作符,__call(),__callstatic()的使用
2017-03-24 15:41
471 查看
<?php echo "<h5>范围解析操作符 :: 的使用<br/>"; echo "在类的内部使用</h5>"; echo "<hr/>"; class Foo{ public function __construct() { define('__AAA__','a'); } public function __call($name, $params) { $this->invoke($name, $params, '__call'); } public function invoke($name, $params, $func) { //框架里面在这里可以使用 call_user_function_array() 来调用类中的方法 var_dump($func); var_dump($name); var_dump($params); exit; } } class MyClass extends Foo { function __construct() { parent::__construct(); } const CONST_VALUE = 'A constant value'; public function testinner() { //次数的self::inner 相当于在内部寻找一个inner的方法,虽然inner方法非静态方法,但是依然会打印出 调用成功 关键词 :: 范围解析操作符 (::) self,parent,static 的使用 self::inner(); //此处的 self:: 相当于在类内部寻找一个test__CALL_PARENT的方法。本类中没有找到,然后回找父类,父类中没有这个方法。则调用__call方法。而不是直接调用静态方法 __callStatic self::test__CALL_PARENT('aaaaaaa'); } public static function __callStatic($name, $arguments) { //此处的static,self,parent 关键词结果都一样,都是调用父类中的invoke 方法 parent::invoke($name, $arguments, '__callStatic'); } public function inner() { echo "调用成功!"; } 4000 public static function staticfunction(){ echo "我是一个静态函数"; } } $classname = new MyClass(); //测试self :: 在类内部的使用 $classname->testinner(); //类外部调用静态方法 $classname::staticfunction(); //类外部调用不存在的静态方法 $classname::testStatic('sssssss','222'); //__call 方法的使用; $classname->aa('aa', 'bb', 'vv', ['aa', 'bb', 'cc']);
parent::__construct()的使用
如果子类中定义了构造函数则不会隐式调用其父类的构造函数。要执行父类的构造函数,需要在子类的构造函数中调用 parent::__construct()。如果子类没有定义构造函数则会如同一个普通的类方法一样从父类继承(假如没有被定义为 private 的话)。
如果子类中也有构造函数,同时希望继承父类的构造函数,那需要使用 parent::construct();
如果 PHP 5 在类中找不到 __construct() 函数并且也没有从父类继承一个的话,它就会尝试寻找旧式的构造函数,也就是和类同名的函数。因此唯一会产生兼容性问题的情况是:类中已有一个名为 __construct()的方法却被用于其它用途时。
与其它方法不同,当 __construct() 被与父类 __construct() 具有不同参数的方法覆盖时,PHP 不会产生一个 E_STRICT错误信息。
:: 范围解析操作符的使用
范围解析操作符(也可称作 Paamayim Nekudotayim)或者更简单地说是一对冒号,可以用于访问静态成员,类常量,还可以用于覆盖类中的属性和方法。
当在类定义之外引用到这些项目时,要使用类名。
自 PHP 5.3.0 起,可以通过变量来引用类,该变量的值不能是关键字(如 self,parent 和 static)。
在类内部使用 self:: 相当于直接访问该方法,而并不把他当做静态变量来处理
相关文章推荐
- 关于PHP面向对象编程中使用范围解析操作符访问非静态方法的注意事项
- PHP:使用范围解析操作符
- php基础知识:类与对象(4) 范围解析操作符(::)
- (转)双冒号 PHP范围解析操作符
- PHP的范围解析操作符(::)的涵义
- PHP双冒号- 范围解析操作符(::)的用法
- PHP的范围解析操作符(::)的涵义
- PHP的范围解析操作符(::)的涵义
- PHP范围解析操作符(::)
- PHP的范围解析操作符(::)的含义分析说明
- php基础知识:类与对象(4) 范围解析操作符(::)
- PHP中---范围解析操作符(::)
- PHP的类和对象(五)static关键字和范围解析操作符
- 【php手册:类与对象】范围解析操作符(::)
- PHP中类静态调用和范围解析操作符的区别解析
- PHP中的魔术方法之__call()和__callStatic()方法的使用
- PHP基础之类和对象8——范围解析操作符(::)
- PHP魔术方法之__call与__callStatic使用方法
- php中__call与__callstatic()使用
- 【面向对象】php新手之学习类与对象-范围解析操作符