您的位置:首页 > 编程语言 > PHP开发

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:: 相当于直接访问该方法,而并不把他当做静态变量来处理

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息