好吧其实很简单,主要问题是,我没有正确阅读文档或者我只是错过了部分,尽管use 关键字在 PHP 中被广泛使用,但除了具有不同的功能之外,这是真的.
无论哪种方式,感谢谁帮助我在评论部分找到了问题[(@riggsfolly,@peterm,@eis,@david),经过良好的阅读和测试,我' d 决定发布我自己的答案。
快速解答
use function [some_function] 是一个 namespace,它为特定位置定义/导入该函数,该位置是命名空间部分,可以从不同命名空间甚至 modifying the name with alias 具有相同命名函数,用于函数和命名空间一起来。
可以是用户定义的命名空间,也可以是全局命名空间
在这种情况下,以这种方式调用内置函数仅仅是为了样式/清晰,但也可能PHP Performance Tip: Use fully-qualified function calls when working with namespaces
详细解答
所以use关键字散布着这些功能:
-
命名空间导入/包含:模块(作为包)、类、特征、接口、函数、常量
- 在闭包函数中使用变量的外部作用域
- 在类中注入特征。
所以我的问题是指第一点导入/包含(函数)。
命名空间在使用类时更加明显,只要在脚本上声明命名空间,该脚本就变得相对于该命名空间,而不是全局。因此,如果您在没有指定命名空间的情况下调用任何未在同一脚本中定义的类,将导致错误,example:
<?php
namespace A\B\C;
class Exception extends \Exception
{
}
$a = new Exception('hi'); // $a is an object of class A\B\C\Exception
$b = new \Exception('hi'); // $b is an object of class Exception
$c = new ArrayObject; // fatal error, class A\B\C\ArrayObject not found
?>
但更清楚的例子是:
<?php
namespace A\B\C;
$b = new Exception('hi'); // Uncaught Error: Class "A\B\C\Exception"
通过移除命名空间,它会回到全局上下文
<?php
$b = new Exception('hi'); // no errors..
但是,const 和 functions 不会发生这种情况,这就是为什么不那么明显,如果找不到,会默默地退回到外部范围。
对于函数和常量,如果命名空间函数或常量不存在,PHP 将回退到全局函数或常量。
<?php
namespace A\B\C;
const E_ERROR = 45;
function strlen($str)
{
return \strlen($str) - 1;
}
echo E_ERROR, "\n"; // prints "45"
echo INI_ALL, "\n"; // prints "7" - falls back to global INI_ALL
echo strlen('hi'), "\n"; // prints "1"
if (is_array('hi')) { // prints "is not array"
echo "is array\n";
} else {
echo "is not array\n";
}
?>
最后,举一些关于我的问题的例子:
文件functions.php
namespace MyApp\Package;
//use function var_dump;
function var_dump($var)
{
echo '[', __NAMESPACE__, '] don\'t wnat to do that...<br/>';
}
function explode($separator, $some_string)
{
echo '[', __NAMESPACE__, '] opps, bomb failed :(...<br/>';
}
文件 index.php
<?php
namespace MyApp;
require_once 'functions.php';
use MyApp\Package; // Demostrate that we can 'import' the entire package namespace
use function MyApp\Package\var_dump; // Import the function only
class A
{
public static function say() {
$a = "a";
$b = "b";
$data = ['a' => $a, 'b' => $b];
echo var_dump($data); // --> Calling the namespaced function
}
public static function sayReal()
{
$a = "a";
$b = "b";
$data = ['a' => $a, 'b' => $b];
echo \var_dump($data); // -> with \ we make the lookup fully-qualified and falls back to global
}
public static function explodeBadBomb($bomb="something to explode")
{
Package\explode(" ",$bomb); // -> demostrate that we can namespaced in withing blocks and statements
}
public static function explodeGooodBomb($bomb="something to explode")
{
echo print_r(\explode(" ", $bomb)); // again calling the built-in
}
}
A::say(); // [MyApp\Package] don't wnat to do that...
A::sayReal(); // array(2) { ["a"]=> string(1) "a" ["b"]=> string(1) "b" }
A::explodeBadBomb(); // MyApp\Package] opps, bomb failed :(...
A::explodeGooodBomb(); // Array ( [0] => something [1] => to [2] => explode )
文档
更多关于性能改进的信息
相关 StackOverflow 问题/解答