PHP 在 (1) 导入非复合命名空间或 (2) 导入任何命名空间以实例化 class 时出错
PHP error while (1) Importing a non-compound namespace or (2) Importing any namespace to instantiate a class
非复合 PHP 命名空间的示例:
namespace Html;
复合 PHP 命名空间的示例:
namespace NS\Html;
如果我尝试导入非复合 PHP 命名空间,我会收到以下错误:
Warning: The use statement with non-compound name 'Html' has no effect in /home/public_html/Samples/PHP/Namespaces/ImportNamespace1.php on line 34
接下来,我尝试使用复合 PHP 命名空间。现在上面的错误(在尝试使用命名空间时)消失了,但是当我尝试在导入的命名空间中实例化 class 时,出现错误:
Fatal error: Uncaught Error: Class 'Table' not found in /home/public_html/Samples/PHP/Namespaces/ImportNamespace1.php:38
我发现有效的是以下组合:
- 使用复合命名空间
- 导入 class 而不是命名空间
然后,我可以实例化 class 而不会出现任何错误。
这与 manual 所说的相反。
请注意我使用的是 Lightspeed PHP 7.3 版。
这是有效的代码:
命名空间定义:必须是复合的(在文件 Namespace1.php 中):
<?php
namespace NS\Html;
class Table
{
}
?>
导入并使用 class(而不是命名空间)(文件导入Namespace1.php):
use NS\Html\Table As Table; # Import and alias the class.
$table = new Table();
?>
我想问:
有没有人实际使用非复合命名空间然后导入命名空间(而不是 class)来实例化 class?请提供实际代码。
如果我没理解错的话,我想这就是你要找的东西?
namespace b {
class my_class{
function test() {
echo 'here';
}
}
}
namespace a {
use b as c;
// FQN
(new \b\my_class())->test();
// Aliased
(new c\my_class())->test();
}
我个人永远不会写这样的代码,我也不知道您可以为命名空间设置别名,但它似乎可以工作。
编辑
这是一个包含两个文件且没有括号命名空间的版本
<?php
// file b.php
namespace b;
class my_class
{
function test()
{
echo 'here';
}
}
<?php
// file a.php
namespace a;
use b as c;
require_once 'b.php';
// FQN
(new \b\my_class())->test();
// Aliased
(new c\my_class())->test();
非复合 PHP 命名空间的示例:
namespace Html;
复合 PHP 命名空间的示例:
namespace NS\Html;
如果我尝试导入非复合 PHP 命名空间,我会收到以下错误:
Warning: The use statement with non-compound name 'Html' has no effect in /home/public_html/Samples/PHP/Namespaces/ImportNamespace1.php on line 34
接下来,我尝试使用复合 PHP 命名空间。现在上面的错误(在尝试使用命名空间时)消失了,但是当我尝试在导入的命名空间中实例化 class 时,出现错误:
Fatal error: Uncaught Error: Class 'Table' not found in /home/public_html/Samples/PHP/Namespaces/ImportNamespace1.php:38
我发现有效的是以下组合:
- 使用复合命名空间
- 导入 class 而不是命名空间 然后,我可以实例化 class 而不会出现任何错误。
这与 manual 所说的相反。
请注意我使用的是 Lightspeed PHP 7.3 版。
这是有效的代码:
命名空间定义:必须是复合的(在文件 Namespace1.php 中):
<?php
namespace NS\Html;
class Table
{
}
?>
导入并使用 class(而不是命名空间)(文件导入Namespace1.php):
use NS\Html\Table As Table; # Import and alias the class.
$table = new Table();
?>
我想问: 有没有人实际使用非复合命名空间然后导入命名空间(而不是 class)来实例化 class?请提供实际代码。
如果我没理解错的话,我想这就是你要找的东西?
namespace b {
class my_class{
function test() {
echo 'here';
}
}
}
namespace a {
use b as c;
// FQN
(new \b\my_class())->test();
// Aliased
(new c\my_class())->test();
}
我个人永远不会写这样的代码,我也不知道您可以为命名空间设置别名,但它似乎可以工作。
编辑
这是一个包含两个文件且没有括号命名空间的版本
<?php
// file b.php
namespace b;
class my_class
{
function test()
{
echo 'here';
}
}
<?php
// file a.php
namespace a;
use b as c;
require_once 'b.php';
// FQN
(new \b\my_class())->test();
// Aliased
(new c\my_class())->test();