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

时间:2013-06-06 10:10:48

标签: php namespaces require-once

我在PHP中实现特定的类时遇到了麻烦。我想在我的Zend Framework应用程序中使用Anthony Ferrara的RandomLib库(你可以找到它here。)

我已经用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
像我说的那样,我真的不知道这里发生了什么。我不知道我是否应该在课堂上使用某种使用陈述。

3 个答案:

答案 0 :(得分:1)

使用带有ZF 1. *的自动加载器,假设您将您的factoru放入application_name / libs / RandomLibFactory.php作为RandomLibFactory类,它应该如下所示:

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

答案 1 :(得分:0)

对于那些花费大量时间而且没有找到线索的人来说,撕裂他的头发并将墙撞死:

  • 你需要一个自动加载器,如" bootstrap.php"在文件夹" test /"中,管理每个命名空间......或者你需要链接文件夹中不是很聪明的每个文件。请参阅php.net中的spl_autoload_register
  • 你刚刚下载了RandomLib,它取决于另一个库(作者没有提到它):所以你需要SecurityLib(它有相同的文件夹结构:复制里面的内容" lib /"进入另一个" lib /"文件夹。

从根文件夹调用脚本的自动加载器示例" RandomLib-1.1.0 /" (请参阅'lib'中的$path):

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>';
}

答案 2 :(得分:0)

在找到Windows机器的解决方案之前,我也撕掉了很多头发。

  1. 我下载了https://stackoverflow.com/a/16758988/334402的Windows版本(我几乎没有听说过,更不用说了)。
  2. 我用它来Composer(如说明的安装部分所示 - 在Windows中使用命令框)
  3. 这会生成一个供应商文件夹,其中包含一个作曲家文件夹,一个ircmaxell文件夹和一个autoload.php文件;这些我上传到我网站的合适位置供应商目录包括random-lib和 - required - security-lib库。
  4. 在我想要生成随机文本的程序中,我包含了autoload.php(前面有合适的目录指针)
  5. 然后我很高兴去创建工厂,生成器和字符串,如图书馆的说明所示