有人用过 PHP 的 use function 吗?

今天想在类文件里面 use 一个方法的引用,查看官方文档是有的。
地址:http://www.php.net/manual/zh/language.name...
但是我引用就是不成功总是报错方法不存在,是我姿势不对吗
controller.php

namespace App\Http\Controllers;

use function App\Http\Controllers\helper;

class WelcomeController
{
    public function test() {
        helper();
    }
}

function.php

namespace App\Http\Controllers;

function helper()
{
    return 1;
}

报错
Call to undefined function App\Http\Controllers\helper()

有没有大佬指点一下

做自己
附言 1  ·  6年前

PHP 7.1

《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
讨论数量: 10
DukeAnn

@Ken 官方文档么有 new function,都是 new class

<?php
namespace foo;
use My\Full\Classname as Another;

// 下面的例子与 use My\Full\NSname as NSname 相同
use My\Full\NSname;

// 导入一个全局类
use ArrayObject;

// importing a function (PHP 5.6+)
use function My\Full\functionName;

// aliasing a function (PHP 5.6+)
use function My\Full\functionName as func;

// importing a constant (PHP 5.6+)
use const My\Full\CONSTANT;

$obj = new namespace\Another; // 实例化 foo\Another 对象
$obj = new Another; // 实例化 My\Full\Classname 对象
NSname\subns\func(); // 调用函数 My\Full\NSname\subns\func
$a = new ArrayObject(array(1)); // 实例化 ArrayObject 对象
// 如果不使用 "use \ArrayObject" ,则实例化一个 foo\ArrayObject 对象
func(); // calls function My\Full\functionName
echo CONSTANT; // echoes the value of My\Full\CONSTANT
?>
6年前 评论
Kurisu

觉得这种调法其实不是太好,不过觉得蛮有意思尝试写了个测试

name App\Http\Controllers;
use function \Asdcse\testAbc as tc;

class Test2Controlelr extends Controller
{
       public function index()
       {
                tc();
       }
}
namespace Asdcse;
function testAbc()
{
         echo('testabc');
}

然后在tinker里执行

$a=new \App\Http\Controller\Test2Controller()
$a->index()

也是报了致命错误,找不到 Asdcse\testAbc() 函数,emmmmmmmmmmmmmmmmmmmmmmmm

6年前 评论
Kurisu

编辑器是不报错了, 但是tinker跑着就报错了,
开头那里是贴过来的时候手误,namespace写成name了

6年前 评论
DukeAnn

@Kurisu 这是个假的吗,我是看见七牛云php-sdk 那么写的
https://github.com/qiniu/php-sdk/blob/mast...
28行

6年前 评论
Kurisu

@ADKi emmmmmmmmmmmmmmmm...或许是姿势不对....

6年前 评论

autoload应该没有加载到那个helper.php文件

6年前 评论
DukeAnn

@gaohuag 这不是引入命名空间就行了嘛

6年前 评论
Kurisu

@gaohuag
@ADKi
有可能,明天composer dumpautoload 试试

6年前 评论

帖子有点老了,既然看到了就回复下。

autoload是用来自动加载class的,并不能自动加载function文件。需要手工inlude。

或者我觉得可以采用下面代码:

<?php
namespace App\Http\Controllers;
class helper
{
    /**该方法仅仅是为了快速加载该文件内函数*/
    static function load(){}
}
function helper()
{
    return 1;
}
<?php
namespace App\Http\Controllers;

use function App\Http\Controllers\helper;

helper::load();// 借助autoload自动加载helper文件

class WelcomeController
{
    public function test() {
        helper();// it's OK
    }
}

我现在是把我们的一些共用方法放到一个名为Functions的文件,其中顶部写了如上类似的class Functions{},需要使用前或者入口文件Functions::load()

5年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!