草庐IT

PHP - spl_autoload 和命名空间 - 不适用于大写字母

coder 2024-04-10 原文

我在我的 index.php 中设置了一个非常基本的自动加载器,以在 hello.php 中获取命名空间类。我的开发环境是 Ubuntu 12.04

我为什么要尝试这样做?我试图坚持 PSR-1PSR-2 coding standard ,其中包括:

Class names MUST be declared in StudlyCaps

Namespaces are as /Vendor/Class (note: capitals)

以下是我的结构和代码有效 之前 对大写字母进行更改

文件夹结构

- web
  -- index.php
  -- core
    --- hello.php

自动加载器

在 index.php 中,我有我的自动加载器:

set_include_path(__DIR__);
spl_autoload_extensions('.php,.class.php');
spl_autoload_register();

类文件

在核心文件夹中,我有 hello.php

namespace core;

class hello {
    public function __construct() {
        echo 'Constructed!';
    }
}

有效的代码

如果我在我的 index.php 中运行 $obj = new\core\hello();,我会返回“Constructed!”。太棒了!


那行不通的

将我的核心文件夹重命名为“核心”——注意大写字母 C,并将 hello.php 中的命名空间重命名为 namespace Core;

现在让我们再试一次 $obj = new\Core\hello();

fatal error :在 ... 中找不到类“Core\hello”

所以请告诉我,为什么我不能使用大写字母来符合 PSR 标准?我做错了什么?

最佳答案

当您在 Linux 平台上运行 PHP 代码时,请务必记住 Linux 对文件名区分大小写。

这会影响自动加载器,因为它们通常在构建要加载的文件名时使用命名空间和类名。

如果文件夹名为core,则命名空间必须为core,大小写相同。如果在命名空间中将其更改为 Core,则必须对文件夹名称执行相同的操作。 (因此,所有其他 core 类必须同时更改为 Core)。

在 Windows 上,这不会发生,因为 Windows 文件系统不区分大小写。当代码在本地基于 Windows 的开发系统上进行测试和运行时,这可能会造成混淆,然后在将其复制到基于 Linux 的服务器时中断。

[编辑]

好的,所以我错过了您也更改了目录名。但尽管如此,我仍然认为这是文件名/目录名大小写的问题。

我注意到您在调用 spl_autoload_register() 时没有任何参数。这意味着默认的 spl_autoload() 函数将用作自动加载器。

如果您阅读 the documentation for spl_autoload() ,您会注意到它使用类和命名空间的小写版本。

换句话说,使用默认的自动加载器,您的类可以大小写混合,但文件夹结构和文件名必须全部小写。

所以实际上,对您而言,您需要将文件名保持小写。

根据我最初的回答,我亲身经历了相反的情况,我有一个完全小写的文件名,当我从 Windows 开发箱转移到 Linux 服务器时,我的混合大小写类名被破坏了。我的经验与您不同的原因是因为我使用的是自定义编写的自动加载函数,它不进行自动小写转换,因此我的文件名的大小写必须与我的类名的大小写相匹配。

关于PHP - spl_autoload 和命名空间 - 不适用于大写字母,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15027486/

有关PHP - spl_autoload 和命名空间 - 不适用于大写字母的更多相关文章

  1. ruby - 匹配大写字母并用后续字母填充,直到一定的字符串长度 - 2

    我有一个驼峰式字符串,例如:JustAString。我想按照以下规则形成长度为4的字符串:抓取所有大写字母;如果超过4个大写字母,只保留前4个;如果少于4个大写字母,则将最后大写字母后的字母大写并添加字母,直到长度变为4。以下是可能发生的3种情况:ThisIsMyString将产生TIMS(大写字母);ThisIsOneVeryLongString将产生TIOV(前4个大写字母);MyString将生成MSTR(大写字母+tr大写)。我设法用这个片段解决了前两种情况:str.scan(/[A-Z]/).first(4).join但是,我不太确定如何最好地修改上面的代码片段以处理最后一种

  2. ruby-on-rails - 如何重命名或移动 Rails 的 README_FOR_APP - 2

    当我在我的Rails应用程序根目录中运行rakedoc:app时,API文档是使用/doc/README_FOR_APP作为主页生成的。我想向该文件添加.rdoc扩展名,以便它在GitHub上正确呈现。更好的是,我想将它移动到应用程序根目录(/README.rdoc)。有没有办法通过修改包含的rake/rdoctask任务在我的Rakefile中执行此操作?是否有某个地方可以查找可以修改的主页文件的名称?还是我必须编写一个新的Rake任务?额外的问题:Rails应用程序的两个单独文件/README和/doc/README_FOR_APP背后的逻辑是什么?为什么不只有一个?

  3. ruby - rails 3 redirect_to 将参数传递给命名路由 - 2

    我没有找到太多关于如何执行此操作的信息,尽管有很多关于如何使用像这样的redirect_to将参数传递给重定向的建议:action=>'something',:controller=>'something'在我的应用程序中,我在路由文件中有以下内容match'profile'=>'User#show'我的表演Action是这样的defshow@user=User.find(params[:user])@title=@user.first_nameend重定向发生在同一个用户Controller中,就像这样defregister@title="Registration"@user=Use

  4. ruby-on-rails - 从应用程序中自定义文件夹内的命名空间自动加载 - 2

    我们目前正在为ROR3.2开发自定义cms引擎。在这个过程中,我们希望成为我们的rails应用程序中的一等公民的几个类类型起源,这意味着它们应该驻留在应用程序的app文件夹下,它是插件。目前我们有以下类型:数据源数据类型查看我在app文件夹下创建了多个目录来保存这些:应用/数据源应用/数据类型应用/View更多类型将随之而来,我有点担心应用程序文件夹被这么多目录污染。因此,我想将它们移动到一个子目录/模块中,该子目录/模块包含cms定义的所有类型。所有类都应位于MyCms命名空间内,目录布局应如下所示:应用程序/my_cms/data_source应用程序/my_cms/data_ty

  5. ruby-on-rails - Rails - 从命名路由中提取 HTTP 动词 - 2

    Rails中有没有一种方法可以提取与路由关联的HTTP动词?例如,给定这样的路线:将“users”匹配到:“users#show”,通过:[:get,:post]我能实现这样的目标吗?users_path.respond_to?(:get)(显然#respond_to不是正确的方法)我最接近的是通过执行以下操作,但它似乎并不令人满意。Rails.application.routes.routes.named_routes["users"].constraints[:request_method]#=>/^GET$/对于上下文,我有一个设置cookie然后执行redirect_to:ba

  6. ruby - 使用 Nokogiri 和 Ruby 命名元素 "text" - 2

    我在尝试使用Nokogiri构建XML文档时遇到了一个小问题。我想将我的元素之一称为“文本”(请参阅​​下面粘贴代码的最底部)。通常,要创建一个新元素,我会执行类似以下的操作xml.text--但它似乎是.text是Nokogiri已经用来做其他事情的方法。因此,当我写这行时xml.textNokogiri没有创建名为的新元素但只是写了意味着成为元素内容的文本。我怎样才能让Nokogiri实际制作一个名为的元素??builder=Nokogiri::XML::Builder.newdo|xml|xml.TEI("xmlns"=>"http://www.tei-c.org/ns/1.0"

  7. ruby-on-rails - Rails 渲染带有驼峰命名法的 json 对象 - 2

    我在一个简单的RailsAPI中有以下Controller代码:classApi::V1::AccountsControllerehead:not_foundendendend问题在于,生成的json具有以下格式:{id:2,name:'Simpleaccount',cash_flows:[{id:1,amount:34.3,description:'simpledescription'},{id:2,amount:1.12,description:'otherdescription'}]}我需要我生成的json是camelCase('cashFlows'而不是'cash_flows'

  8. ruby - 使用 autoload 与 ruby​​ 中的 require 进行惰性评估? - 2

    在我的代码中,我使用自动加载进行惰性评估,这样我可以更快地加载程序并在需要时加载文件,我没有看到很多人使用它,但在Thin项目中我注意到自动加载已被广泛使用,反正只是想知道使用它是否有任何风险。 最佳答案 autoload是notthreadsafe并将在未来的Ruby版本中弃用。这是proofbyMatz(ruby的创造者)。 关于ruby-使用autoload与ruby​​中的require进行惰性评估?,我们在StackOverflow上找到一个类似的问题:

  9. ruby-on-rails - Ruby/Rails 命名约定 - 2

    如果我生成一个名为"product"的脚手架,当我使用它们编写我的应用程序时,它们之间有什么区别?@products,@product,@Product,@Products,产品,Product、product和products(我很确定这些并没有全部用到,但它至少应该让我知道我在做什么'指的是)。对于@/capitalization/plurality的每个组合的含义,我似乎找不到简单的解释。将不胜感激。 最佳答案 你可以阅读Rubystyleguide和Railsstyleguide,您会得到问题的答案。

  10. ruby-on-rails - 这个 C 和 PHP 程序员如何学习 Ruby 和 Rails? - 2

    按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭9年前。我来自C、php和bash背景,很容易学习,因为它们都有相同的C结构,我可以将其与我已经知道的联系起来。然后2年前我学了Python并且学得很好,Python对我来说比Ruby更容易学。然后从去年开始,我一直在尝试学习Ruby,然后是Rails,我承认,直到现在我还是学不会,讽刺的是那些打着简单易学的烙印,但是对于我这样一个老练的程序员来说,我只是无法将它

随机推荐