PHP 范围解析操作符,__call(),__callstatic()的使用

<?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方法非静态方法,但是依然会打印出 调用成功   关键词   ::  范围解析操作符 (::  selfparentstatic 的使用
        self::inner();
        //此处的 self:: 相当于在类内部寻找一个test__CALL_PARENT的方法。本类中没有找到,然后回找父类,父类中没有这个方法。则调用__call方法。而不是直接调用静态方法 __callStatic
        self::test__CALL_PARENT('aaaaaaa');
    }
    public static function __callStatic($name, $arguments)
    {
        //此处的staticselfparent 关键词结果都一样,都是调用父类中的invoke 方法
        parent::invoke($name, $arguments, '__callStatic');
    }

    public function inner()
    {
        echo "调用成功!";
    }
    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 起,可以通过变量来引用类,该变量的值不能是关键字(如 selfparent 和 static)。

在类内部使用 self:: 相当于直接访问该方法,而并不把他当做静态变量来处理

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值