首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法使用PHP命名空间将给定的类名解析为字符串

无法使用PHP命名空间将给定的类名解析为字符串
EN

Stack Overflow用户
提问于 2019-01-07 07:30:37
回答 1查看 53关注 0票数 1

我正在迁移我的PHP应用程序以使用名称空间,以便为将其放到GitHub上做准备。这其中的大部分都很简单,但我有一个地方,当类的名称由字符串提供时,代码必须从类中获取静态信息,而我找不到适用于这种情况的正确语法:

代码语言:javascript
复制
if ($className == '')
{
    $className          = 'Record';
    $information['classname']   = 'Record';
}
if (!class_exists(__NAMESPACE__ . "\\" . $className))
    {
        print "<p>include '". __NAMESPACE__ . "/" . $className . ".inc'</p>\n";
        include __NAMESPACE__ . "/" . $className . ".inc";
    }

    // BOTH of the following statements report Class 'Blog' not found
    // when $className == "Blog"
$order  = $className::$defaultOrder;
$order  = __NAMESPACE__ . "\\" . $className::$defaultOrder;

当类的名称在变量中提供时,引用名称空间中的类的静态成员的正确语法是什么?调用上述代码的网页的输出为:

代码语言:javascript
复制
include 'Genealogy/Blog.inc'
Blog.inc included
Fatal error: Uncaught Error: Class 'Blog' not found in /home/jcobban/includes/Genealogy/Record.inc:2043 Stack trace: #0 /home/jcobban/includes/Genealogy/RecordSet.inc(418): Genealogy\Record::getInformation('Blogs') #1 /home/jcobban/includes/Genealogy/Template.inc(2898): Genealogy\RecordSet->__construct('Blogs', Array) #2 /home/jcobban/includes/Genealogy/Template.inc(764): Genealogy\FtTemplate->customization() #3 /home/jcobban/public_html/Genealogy/genealogy.php(82): Genealogy\Template->__construct('/home/jcobban/p...') #4 {main} thrown in /home/jcobban/includes/Genealogy/Record.inc on line 2043

上面的代码在基类Genealogy\Record中,这个基类在"Genealogy/Record.inc“中实现。此基类的定义如下:

代码语言:javascript
复制
<?php
namespace Genealogy;
use \PDO;
use \Exception;
use \ArrayAccess;
use \Countable;
use \Iterator;
class Record implements Iterator, ArrayAccess
{
...
protected static    $defaultOrder   = '';

派生类Genealogy\Blog在"Genealogy/Blog.inc“中实现如下:

代码语言:javascript
复制
<?php
namespace Genealogy;
use \PDO;
use \Exception;
require_once __NAMESPACE__ . '/Record.inc';
print "<p>Blog.inc included</p>\n";
class Blog extends Record
{
...

类Blog不覆盖静态成员$defaultOrder的基定义。

仅供参考,我通过运行以下PERL脚本将库的代码转换为使用名称空间:

代码语言:javascript
复制
use strict;
use warnings;
use 5.010;

use File::Find;
use File::Slurp;

my @content;
find( \&wanted, '/home/jcobban/includes/');

exit;

sub wanted {
  if ((substr $File::Find::dir, -9) ne "Genealogy" && -f)
  {
    print "wanted: ",  $File::Find::name, "\n";
my @lines   = read_file($File::Find::name);
my $first   = shift @lines;
if ((substr $first, 0, 5) eq '<?php')
{
    foreach my $line (@lines){
    $line   =~ s#require_once(\s*)(['"])#require_once$1__NAMESPACE__ . $2/#;
    $line   =~ s#require(\s*)(['"])#require$1__NAMESPACE__ . $2/#;
    $line   =~ s#include(\s*)(['"])#include$1__NAMESPACE__ . $2/#;
    $line   =~ s#include(\s*)\$#include$1__NAMESPACE__ . "/" . \$#;
    $line   =~ s#class_exists\((['"])#class_exists(__NAMESPACE__ . $1\\\\#;
    $line   =~ s#class_exists\((\$)#class_exists(__NAMESPACE__ . "\\\\" . $1#;
    }
    my $newfile = $File::Find::dir . "/Genealogy/" . $_;
    print "add namespace and write to $newfile\n";
    unshift @lines, "use \\Iterator;\n";
    unshift @lines, "use \\Countable;\n";
    unshift @lines, "use \\ArrayAccess;\n";
    unshift @lines, "use \\Exception;\n";
    unshift @lines, "use \\PDO;\n";
    unshift @lines, "namespace Genealogy;\n";
    unshift @lines, $first;
    write_file($newfile, @lines);
}
  }
  return;
}

我认为这并不重要,但该网站运行的是PHP版本7.2.10。

此库中的类实现了SQL数据库的面向对象接口。也就是说,应用程序代码使用子脚本表示法访问记录中的字段,并通过$ record ->save()更新记录,该方法确定是否使用INSERT或UPDATE来应用更改,并为SQL服务器使用正确的语法。出现在异常中的RecordSet类封装了SQL查询,呈现了记录实例数组的外观,并允许对集合中的所有成员执行更新和删除操作。这两个类,以及从它们派生的支持单个表的类,将应用程序代码与SQL完全隔离。

EN

回答 1

Stack Overflow用户

发布于 2019-01-07 12:27:15

我遇到的问题似乎是::运算符是在连接之前处理的。当我将代码更改为:

代码语言:javascript
复制
$nsclass                = __NAMESPACE__ . "\\" . $className;
if (!class_exists($nsclass))
{
    include __NAMESPACE__ . "/" . $className . ".inc";
}
$order                  = $nsclass::$defaultOrder;

啊,真灵。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54066871

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档