我目前正在学习名称空间,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;
答案 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
包含在应用程序代码中的某个位置,您无需在任何时候遍历层次结构中的每个文件。