【问题标题】:Access namespace in parent file from included child file (php)从包含的子文件(php)访问父文件中的命名空间
【发布时间】:2018-02-02 10:55:43
【问题描述】:

我对 PHP 命名空间项目非常陌生。我正在尝试设置一个简单的项目。假设我有一个文件 header.php。在文件的顶部我有这个代码:

use Src\Myclass; 

在我的 header.php 中我可以调用

new Myclass()

现在我有一个名为 index.php 的文件。我在此文件中包含 header.php

include 'header.php'

既然header.php已经有'use Src\MyClass',为什么我不能从index.php调用new MyClass()强>文件?

如果我也将use语句添加到index.php文件中,我可以再次调用new MyClass(),但这似乎是多余的,因为我已经在包含的header.php中包含了use语句?

在父文件中声明使用时,同样的问题也适用,然后包括子文件。子文件将无法访问包含在父文件中的 use 语句中的类。

所以,如果我有一个 index.php 文件调用 10 个子文件(例如)menu.phpfooter.phppartial-1.php 等。我需要将use语句添加到所有这些子文件中吗? (从我的测试看来是这样)为什么我不能通过父文件中的 use 语句访问该类?就像我通常能够访问父类中定义的变量一样。

我觉得必须有一种更好/更清洁的方式来访问所有子文件中的类,而不是必须添加

use Src\Myclass; 

到每个单独的子文件。

【问题讨论】:

    标签: php namespaces


    【解决方案1】:

    命名空间,即namespace use 声明,仅适用于它们所在的文件。它们不会隐式应用于其他包含或包含的文件。

    namespaceuse 实际上只是事物名称的语法助手。可以每次都写class Src_MyClassnew Src_MyClass;这是在 PHP 中存在命名空间支持之前“命名空间”的旧方式。 namespace 所做的只是在文件中每个相关名称之前隐式地添加该命名空间,而 use 所做的只是让您在文件中通过较短的名称隐式引用命名空间的名称。

    如果这些规则将隐式地在文件中全局应用,那么跟踪和理解名称实际上指的是什么将变得相当不可能。所以这个别名和命名空间被本地化到每个单独的文件。

    【讨论】:

    • 好吧,那是有道理的。但是我使用composer autoload,我认为添加'use Src\MyClass'相当于require_once(src\myclass.php)。但事实并非如此,对吧?因为如果是这样的话,我猜它可以让我访问包含的子文件中的 tradingplatform 类。使用就像是指向某个文件的一种指针,以及实际的 require/include 是否正确PHP 类仅在我调用“new MyClass()”时完成
    • 是的,userequire 完全无关。这是通过自动加载机制完成的,无论您是否使用use,它都会启动。
    • 好的,我想我快到了。但是,在这种自动加载机制的情况下,究竟是什么触发了实际的类加载呢?只是命名空间中的每个类都自动加载,还是调用类名作为触发器? (对不起,这对我来说都是新的......)
    • 第一次类定义是必需而PHP找不到类是在自动加载器被要求加载类的时候。 use Foo\BarBar::class 之类的东西不需要加载类详细信息;但是new Barclass Baz extends Bar .
    猜你喜欢
    • 1970-01-01
    • 2011-05-29
    • 2018-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-24
    • 2017-12-10
    相关资源
    最近更新 更多