gpt4 book ai didi

php - 如何将我的命名空间与 PHP 中的文件夹层次结构联系起来?

转载 作者:行者123 更新时间:2023-12-04 16:54:32 24 4
gpt4 key购买 nike

我目前正在学习命名空间,use 的用法和喜欢的,但由于某种原因,我不太明白。

我有这个结构:

main_project
-inc
-..
-..
-Social
-interfaces
-[*]social_scrape.php
-[*]social_post.php
-[*]instagram.php
-[*]posts.php
-..

简而言之,我有文件夹 inc来自 我自动加载(这是一个 for 循环,require_once 来自列表的一堆文件)只有这些文件:
~path/inc/Social/instagram.php + posts.php
切记, 我没有加载 Interfaces 文件夹中的文件。 现在,我现在的 instagram.php看起来完全像这样:
<?php

namespace Social_Life;


interface Scrape_Interface {

public function build_endpoint();

public function get_json();

public function get_data();
}

class Scrape_Instagram implements Scrape_Interface {}

但这在 OOP 方面很糟糕。接口(interface)应该是其他类应该能够使用的契约,因此,它应该与我的 instagram.php 无关。文件。所以,我决定把它移到:
~path/inc/Social/Interfaces/social_scrape.php并像这样初始化它(不从自动加载器加载文件):
use Social_Life\Interfaces\Social_Scrape\Scrape_Interface;我的新 scrape_interface.php 文件如下所示:
<?php

namespace Social_Life\Interfaces\Social_Scrape;

interface Scrape_Interface {

public function build_endpoint();

public function get_json();

public function get_data();
}

但这失败了:
Fatal error: Interface 'Social_Life\Interfaces\Social_Scrape\Scrape_Interface' not found in C:\xampp\htdocs\wordpress\wp-content\themes\s-master\inc\Social\instagram.php on line 7

最佳答案

您只解决了 2/3 的问题,命名空间和文件层次结构,如果没有将命名空间类名映射到该层次结构中的文件并自动加载的东西,这些问题就毫无意义。一个自动装载机。

您可以自己编写并注册 spl_autoload_register() ,但我建议而不是让您的命名空间和文件层次结构与 PSR-4 保持一致。并使用 Composer作为自动加载器。现在,您的代码更易于重用和重新分发,您可以利用 Composer 引入和更新您的依赖项,或发布您的代码供其他人使用。

因此,例如,我们想稍微调整层次结构:

main_project/
-inc/
-Social/
-Interfaces/
-Social_Scrape.php // joshc\social_scrape\Social\Interfaces\Social_Scrape
-Social_Post.php // joshc\social_scrape\Social\Interfaces\Social_Post
-Instagram.php // joshc\social_scrape\Social\Instagram
-Posts.php // joshc\social_scrape\Social\Posts
-composer.json
-vendor/
-example.php

请注意,文件名大小写需要与类和声明的命名空间相匹配。

还有你的最小 composer.json看起来像:
{
"name": "joshc/social_life",
"autoload": {
"psr-4": {
"joshc\\social_life\\": "inc/"
}
}
}

其中定义了命名空间 joshc\social_life Root 于 inc/目录相对于 where composer.json位于。请注意,PSR-4 要求您声明供应商 namespace [例如:joshc],并且约定是下一级是包名称。 [例如:social_life]

运行 composer install生成 Composer 自动加载器。

示例类文件, Social_Scrape.php :
<?php
namespace joshc\social_life\Social\Interfaces;

interface Social_Scrape { ... }

example.php :
<?php
require(__DIR__.'/vendor/autoload.php');
use joshc\social_life\Social\Interfaces\Social_Scrape;

class Scrapey implements Social_Scrape { ... }

现在您只需要担心 vendor/autoload.php包含在应用程序代码的某处,您不必在任何时候遍历层次结构中的每个文件。

关于php - 如何将我的命名空间与 PHP 中的文件夹层次结构联系起来?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48836707/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com