gpt4 book ai didi

symfony - 尝试使用 Symfony 组件并遇到命名空间问题

转载 作者:行者123 更新时间:2023-12-02 21:44:10 25 4
gpt4 key购买 nike

所以我正在开始一个新项目并想要使用一些 Symfony 组件。我以前没有在 PHP 中使用过 namespace ,我在 Java 工作中熟悉了这个概念。

我有这段简单的代码,当我运行它时,我收到错误:PHP fatal error :在第 52 行/home/me/scrapes/Symfony/Component/CssSelector/CssSelector/CssSelector.php 中找不到类“Symfony\Component\CssSelector\XPath\Translator”

我认为这是我对 namespace 事物缺乏了解。/home/me/scrapes/Symfony/Component/CssSelector/CssSelector/XPath/Translator.php 确实存在。

<?php
set_include_path('/home/me/html/inc');
require 'functions.php';
require 'Symfony/Component/DomCrawler/Crawler/Crawler.php';
require 'Symfony/Component/CssSelector/CssSelector/CssSelector.php';

use Symfony\Component\DomCrawler\Crawler;
use Symfony\Component\CssSelector\CssSelector;

$crawler = new Crawler();
$crawler->addContent('<html><body><p>Hello World!</p></body></html>');
print $crawler->filter('body > p')->text();

curl_close($ch);

require 'cleanup.php';
?>

感谢您的帮助

最佳答案

我认为这是因为,如果您查看所需的文件(例如 Symfony/Component/DomCrawler/Crawler/Crawler.php ),您会发现这些文件使用它们自己的 use语句(加载其他类)。

命名空间

让我们从命名空间开始。命名空间用于轻松地在不同的包中创建具有相同名称的类。假设我有一个名为 Foo 的包和一个名为 Bar 的包。两个包都包含 Client用于执行一些客户端工作的类(例如,一个用于调用 Google map API,另一个用于调用 Facebook Graph API)。我们还假设这两个包都不使用命名空间。

如果我执行以下代码:

<?php
require 'Foo/Client.php';
require 'Bar/Client.php';

这不会起作用,因为两个包都声明了 Client类(class)。哎呀,PHP 如何知道哪个 Client如果您这样做,要使用的类?

<?php
$client = new Client();

它不会知道哪个 Client使用,因此它放弃并抛出错误。

如果您使用命名空间(在文件顶部使用 PHP 中的 namespace 关键字声明,位于 <?php 正下方),您可以防止这种情况发生。 Foo包可以创建Client Foo中的类(class)命名空间和 Bar包在 Bar命名空间。现在我们可以实际上使用这两个文件并创建一个客户端:

<?php
require 'Foo/Client.php'
require 'Bar/Client.php'

$fooClient = new Foo\Client();
$barClient = new Bar\Client();

这会很好地工作。

我想您可能遇到过 Foo_Client旧 PHP 库中的表示法。这是在 PHP 原生支持 namespace 之前创建 namespace 的一种旧方法。

“但是”,我听到你说,“每次我想实例化一个类时都写 Foo\Bar\Baz\Client() 是相当麻烦的”。

是的,这就是 use 的位置关键字进来。当使用use时关键字,我可以告诉 PHP 我想使用特定的客户端,只需使用类名,如下所示:

<?php
require 'Foo/Bar/Baz/Client.php'
use Foo\Bar\Baz\Client;

$client = new Client();

如果您使用use Foo\Bar\Baz\Client,这将起作用。语句,因为你告诉 PHP“好吧,我想使用 Client 命名空间中的 Foo\Bar\Baz 类,当我使用 Client 类时要使用该类。

自动加载

现在,如果您使用许多不同的类并将它们分成几个文件(您应该这样做),会发生什么。你会得到很多不同的requireuse文件顶部的语句。这就是自动加载的用武之地。

已经有spl_register_autoloader函数在 PHP 中已经使用了一段时间了。 PHP 使用此函数来找出当您实例化一个未知的类时要使用哪些文件,因为您没有 require文件。这个函数既可以在创建类时使用,也可以在您 use 时使用,这是关键部分一个类

这就是您的代码中发生的情况。您没有注册可以翻译 use 的自动加载器实际类声明所需的文件中的语句。

太好了,我该如何修复它?

要解决这个问题,我建议您阅读 PHP-FIGPSR-4 。这些人创建了标准(您可以遵循但没有义务)。创建易于使用的库,例如 Symfony 组件。完成此操作后,请阅读 Composer 。完成此操作后,您可以删除 require代码中的语句并使用 Composer 自动加载您需要的所有类。

关于symfony - 尝试使用 Symfony 组件并遇到命名空间问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19796593/

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