如何将我的命名空间绑定到PHP中的文件夹层次结构?

时间:2018-02-17 00:24:07

标签: php oop namespaces

我目前正在学习名称空间,SELECT等用法,但出于某种原因,我无法理解它。

我有这个结构:

SELECT [Category], [SEL] 
FROM [myTable] 
WHERE [Category] IN (SELECT [Category] 
                     FROM [myTable] 
                     GROUP BY [Category] 
                     HAVING COUNT(*) > 1)

简而言之,我有来自的文件夹use我自动加载(它是一个循环,main_project -inc -.. -.. -Social -interfaces -[*]social_scrape.php -[*]social_post.php -[*]instagram.php -[*]posts.php -.. 列表中的一堆文件)只有这些文件:

inc

请记住,我没有在Interfaces文件夹中加载文件。现在,我当前的require_once看起来完全像这样:

~path/inc/Social/instagram.php + posts.php

但就OOP而言,这是不好的。接口应该是其他类应该能够使用的合同,因此,它应该与我的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 {} 并初始化它(不加载自动加载器中的文件),如下所示:

instagram.php我的新 scrape_interface.php 文件如下所示:

~path/inc/Social/Interfaces/social_scrape.php

但这失败了:

use Social_Life\Interfaces\Social_Scrape\Scrape_Interface;

1 个答案:

答案 0 :(得分:2)

您只解决了2/3的问题,命名空间和文件层次结构,如果没有将命名空间类名称映射到该层次结构中的文件并自动加载的内容,则这些问题毫无意义。自动加载器。

您可以编写自己的代码并使用spl_autoload_register()进行注册,但我建议您使用PSR-4并将Composer与{{3}}一致,而不是将其命名为{{3}}。自动加载磁带机。现在,您的代码更易于重用和可再发行,您可以利用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根据inc/目录相对于composer.json所在的目录。请注意,PSR-4要求您声明供应商名称空间[例如:joshc],并且约定是下一级别是包名称。 [例如:social_life]

运行composer install会生成编辑器自动加载器。

示例类文件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包含在应用程序代码中的某个位置,您无需在任何时候遍历层次结构中的每个文件。