如何在PHP中使用命名空间实现一个类

4
我在PHP中实现特定类时遇到了问题。我想在我的Zend Framework应用程序中使用Anthony Ferrara的RandomLib库(您可以在此处找到它:https://github.com/ircmaxell/RandomLib)。
我已经使用PHP编程几年了,所以大部分时间都能熟练掌握。但是,当涉及到使用实现命名空间的类时,我必须承认自己有点不知所措。这是我的代码:
public static function generateToken()
{
    require_once 'RandomLib/Factory.php';
    $factory = new \RandomLib\Factory;
    $generator = $factory->getMediumStrengthGenerator();
    return $generator->generate(16);
}

很不幸,我遇到了以下错误:
Fatal error: Class 'SecurityLib\AbstractFactory' not found in C:\xampp\php\includes\RandomLib\Factory.php on line 30

就像我说的那样,我真的不知道这里在发生什么。我不知道在我的类中是否应该使用某种use语句。


1
你使用的是哪个版本的ZF?你需要配置你的自动加载器以正确地加载RandomLib的类。 - Maerlyn
2
这与命名空间无关。我期望该库使用自动加载器或类似的东西。你需要确保它能正常工作。请检查其文档。 - hek2mgl
我正在使用版本1.11。现在,又有一个新手问题:我该如何配置自动加载器以正确加载RandomLib类? - blainarmstrong
1
我发现这个库没有介绍自己的自动加载器。你应该使用来自 Zend 框架的自动加载器:http://framework.zend.com/manual/1.12/en/zend.loader.autoloader.html 或者我的一个:) - hek2mgl
3个回答

1

使用ZF 1.*的自动加载器时,假设您将工厂放置在application_name/libs/RandomLibFactory.php中作为RandomLibFactory类,则应该如下所示:

public static function generateToken() {
    $factory = $locator = new RandomLibFactory();
    $generator = $factory->getMediumStrengthGenerator();
    return $generator->generate(16); }

0

对于那些花费了大量时间却毫无头绪,拔光头发并且撞墙到死的人:

  • 你需要在“test/”文件夹中有一个名为“bootstrap.php”的自动加载器,以管理每个命名空间...或者你需要链接文件夹中的每个文件,这不是很明智。请参见php.net中的spl_autoload_register
  • 你刚刚下载了RandomLib,它依赖于另一个库(作者没有提到):所以你需要SecurityLib(它具有相同的文件夹结构:将“lib/”中的内容复制到另一个“lib/”文件夹中。

自动加载器示例,用于从根文件夹“RandomLib-1.1.0/”调用脚本(请注意$path中的'lib'?):

spl_autoload_register(function ($class) {
    $nslen = strlen(__NAMESPACE__);
    if (substr($class, 0, $nslen) != __NAMESPACE__) {
        //Only autoload libraries from this package
        return;
    }
    $path = substr(str_replace('\\', '/', $class), $nslen);
    $path = __DIR__ . '/lib/' . $path . '.php';
    if (file_exists($path)) {
        require_once $path;
    }
});

现在你已经设置好了,可以自由使用类而不必担心包含或要求文件。

$factory = new RandomLib\Factory;

$generator = $factory->getLowStrengthGenerator();
//$generator = $factory->getMediumStrengthGenerator();
//$generator = $factory->getHighStrengthGenerator();

$randomStringLength = 16;
$randomStringAlphabet = '0123456789@abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/';
$randomString = '';

for ($i=0;$i<10;$i++){
    $randomString = $generator->generateString( $randomStringLength , $randomStringAlphabet);
    echo $randomString.'<br>';
}

0

在我找到解决方案之前,我也曾为我的Windows机器烦恼了很久。

  1. 我下载了Composer的Windows版本(我几乎没有听说过,更不用说使用过了)。
  2. 我使用它来安装RandomLib(如说明书中的安装部分所示 - 在Windows中使用命令框)。
  3. 这生成了一个包含composer文件夹、ircmaxell文件夹和autoload.php文件的vendor文件夹;我将它们上传到我的网站上适当的位置。vendor目录包括随机库和所需的安全库库。
  4. 在我想要生成随机文本的程序中,我包含了那个autoload.php文件(在适当的目录指针之前)。
  5. 然后,我就可以按照库的说明创建工厂、生成器和字符串了。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接