类名的动态函数

时间:2017-07-05 13:27:14

标签: php laravel magic-function

我想要了解一下Laravel如何基于Facade类创建魔术函数。现在我想要的是魔术函数中的中心类是基于类名创建的。例如:

// Example main class
class Facade 
{
    public function __construct(array $aliases = [])
    {
        $this->aliases = $aliases;
    }

    public function load()
    {
        // Do some magic...
    }
}

// Example Facade subclass
class Navigation 
{
    public function items(string $name)
    {
        return $name;
    }
}

// Array with aliases
$aliases = [
    'navigation' => 'App\Facades\Navigation',
];
new Facade($aliases);

// Then I want to call everywhere:
echo navigation()->items('name'); == 'name'

我怎么能这样做,我找不到任何关于Laravel如何做的事。

1 个答案:

答案 0 :(得分:0)

定义PHP自动加载器而不是Facade类:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

    <xsl:output method="xml" indent="yes"/>
    <xsl:strip-space elements="*"/>

    <xsl:template match="countries">
        <SampleOutput>
            <xsl:apply-templates select="country//literacyRates"/>
        </SampleOutput>
    </xsl:template>

    <xsl:template match="literacyRates">
        <literacyRates>
            <xsl:attribute name="country" select="ancestor::country/@name"/>
            <xsl:attribute name="type" select="name(..)"/>
            <xsl:value-of select="."/>
        </literacyRates>
    </xsl:template>

</xsl:stylesheet>

然后打电话给你的班级(注意缺少的括号):

spl_autoload_register(function ($class_name) {
    $aliases = [
        'navigation' => 'App\Facades\Navigation',
    ];

    if (array_key_exists($class_name, $aliases) {
        include $aliases[$class_name] . '.php';
    }
});

了解更多信息 - PHP autoload doc