__callStatic():从静态上下文实例化对象吗? - php

我对PHP中的“静态”和“动态”函数与对象如何协同工作感到困惑,尤其是在__callStatic()方面。

__callStatic()的工作方式:

您可以有一个普通的类MyClass,在该类中您可以
放置一个名为__callStatic()的静态函数,该函数仅被调用
当MyClass没有您想要的名称的静态函数时。

即我致电MyClass::newFunction();

newFunction()被静态调用,但MyClass不被静态调用
宣布。因此,然后__callStatic()被调用并
在里面你可以说

$myObject=new SomeOtherClass();
$myObject->newFunction();

它将调用您想要的函数,但在其他对象上。

精简版:

换句话说,__callStatic()这样做:

MyClass::newFunction();

这隐藏了这个:

(new SomeOtherClass())->newFunction();

现在说什么?看起来像是从一个类调用静态函数的代码,原来是从某个其他类调用该函数并通过实例化而不是静态地调用它。

请解释一下!

为什么要做?您可以在其他地方(例如C ++或Java)做类似的事情吗?我正在寻找有关语言中静态和动态函数的简短明了但内容丰富的解释,在这种情况下,无论是__callStatic()violates还是conforms语言结构的总体视图。还是完全是一种新的语言结构。

参考方案

__callStatic()为开发人员提供了对static方法调用做出反应的可能性,即使该方法不存在或无法从类外部(即protected)访问也是如此。这对于动态通用代码生成很有用。

示例:您有此类:

class Test {

    protected static function myProtected($test) {
        var_dump(__METHOD__, $test);
    }

    public static function __callStatic($method, $args) {
        switch($method) {
            case 'foo' :
                echo 'You have called foo()';
                var_dump($args);
                break;

            case 'helloWorld':
                echo 'Hello ' . $args[0];
                break;

            case 'myProtected':
                return call_user_func_array(
                    array(get_called_class(), 'myProtected'),
                    $args
                );
                break;                      
        }

    }

}

尝试致电:

// these ones does not *really* exist
Test::foo('bar');
Test::helloWorld('hek2mgl');

// this one wouldn't be accessible
Test::myProtected('foo');

PHP getallheaders替代 - php

我正在尝试从服务器上的apache切换到nginx。唯一的问题是我在PHP脚本中使用的getallheaders()函数,该函数不适用于Nginx。我已经尝试过用户在getallheaders函数上的php站点上提供的注释,但这并不返回所有请求标头。请告诉我如何解决这个问题。我真的想切换到Nginx。 参考方案 您仍然可以使用它,但是您必须像这里一样重新定义…

php:是否有充分的理由引用所有数组键/索引? - php

我正在遍历别人的代码,他们总是避免转义其数组键。例如:$ row_rsCatalogsItems [名称]代替$ row_rsCatalogsItems ['名称']因此,我不断地对自己接触的所有事物进行微小的更改,以应对这些惰性。但是现在我想知道这样做是否有很多好处。我得到它会在默认为字符串之前检查常量(我在处理常量时会讨厌php中的行为,因为即使未定义,…

PHP标头功能不起作用 - php

我曾经使用此功能从一个PHP页面重定向到另一个:header( 'Location: student.php?cnp='.$_REQUEST['name']) ; 在我的本地主机中,它确实可以工作,但是如果在Internet中对其进行测试,则不会重定向。我也尝试给出完整的路径(如http://.../student.p…

为什么在PHP中将函数存储为变量 - php

我已经在php文档中看到了这种做法:$foo = function() { echo 'foo'; } $foo(); 您为什么要这样做,而不仅仅是:function foo() { echo 'foo'; } foo(); 参考方案 它们在某些方面很有用。我个人使用它们是因为它们比实际功能更易于控制。而且,匿名函数可…

PHP数组可以这样做吗? - php

可以说;我有一个$ friends数组,其中有2,000个不同的friendID号+我有一个带有10,000 bulletinID号的$ bulletins数组,该$ bulletins数组还将具有另一个值,该ID的用户ID是发布公告条目的用户现在可以获取所有具有与FriendsID数组中的userID匹配的userID的bulletinID号吗?甚至有可能…