【问题标题】:What is the best practice for using non-namespaced classes within namespaced class在命名空间类中使用非命名空间类的最佳实践是什么
【发布时间】:2013-11-18 00:53:29
【问题描述】:

我正在使用 PHP 在最近更新中实现的美妙的新命名空间功能创建一个库。但是,我需要在我的一个类中使用 simple_html_dom.php 类。我正在使用符合标准 PSR-0 的自动加载器类,但由于下划线,我在尝试创建 simple_html_dom 类的新对象时遇到错误。

查看我的自动加载器类时,它会用下划线代替重击。这很容易解决,但我担心它可能会破坏我的 PSR-0 合规性。我想知道解决遗留库的此类问题的最佳做法是什么。

目录结构

- vendor/
  - MyStuff/
    - lib/
      - simple_html_dom.php
    - MyClass1.php

MyClass1.php

<?php
namespace MyStuff;

// This require works
require(__DIR__ . '/lib/simple_html_dom.php');

class MyClass1 {

    public function __construct() {
         // This breaks
         // Warning: require(C:\www\vendor\LoU\simple\html\dom.php): failed to open stream
         $html = new simple_html_dom();

    }
}

【问题讨论】:

  • 检查(或使用)我写的自动加载器。它可以(一起)处理两者。 github.com/metashock/Jm_Autoloader/blob/master/lib/php/Jm/…
  • @hek2mgl 即使中断类没有命名空间并且包含多个类?
  • 你的意思是一个文件包含多个类?还没有,暂时还没有添加。如果多个类在一个文件中,我建议使用像 Autoloader::registerClass($class, $file).. 这样的方法。但是在一个文件中包含多个类被认为是糟糕的设计 (IMO)
  • 是的,它是一个旧库,但到目前为止它似乎工作得很好(如我上面的示例所示,不使用自动加载来包含这个库)
  • 不要使用 simple_html_dom..(它什么时候会死??,什么时候??).. 它是为 PHP4 设计的。现在在 PHP5 中(大约 10 年以来)有 DOMXPath。快速修复是将require_once 放在自动加载器类的顶部

标签: php namespaces require autoloader


【解决方案1】:

给出这个 - 自我广告 - 回答只是因为你告诉我这样做。 :)

您可以使用我的自动加载器类:Jm_Autoloader。 (你在 cmets 中告诉过它对你有用)

它旨在与OLD_SCHOOL_CLASS_NAMES\new\school\class\Names 一起使用,并且两种样式混合在一起。

使用 PEAR 很容易安装:

pear channel-discover metashock.de/pear
pear channel-update metashock
pear install metashock/Jm_Autoloader

在您的主 php 脚本之上添加:

require_once 'Jm/Autoloader.php';

在大多数情况下就是这样。如果不是,有些选项我不会在这里描述,因为它不属于这里。

玩得开心!

【讨论】:

    猜你喜欢
    • 2013-05-18
    • 2010-10-03
    • 1970-01-01
    • 2014-07-21
    • 2021-09-02
    • 1970-01-01
    • 2014-02-16
    • 1970-01-01
    • 2012-01-25
    相关资源
    最近更新 更多