go_dxy 2015-11-11 13:29:44 13482次浏览 13条回复 0 0 0
<?php

namespace app\controllers;

use yii\web\Controller;
use yii\data\Pagination;
use app\models\Country;

class CountryController extends Controller
{
    public function actionIndex()
    {
        $query = Country::find();

        $pagination = new Pagination([
            'defaultPageSize' => 5,
            'totalCount' => $query->count(),
        ]);

        $countries = $query->orderBy('name')
            ->offset($pagination->offset)
            ->limit($pagination->limit)
            ->all();

        return $this->render('index', [
            'countries' => $countries,
            'pagination' => $pagination,
        ]);
    }
}

上面代码中。

use yii\web\Controller;
use yii\data\Pagination;
use app\models\Country;

使用这种方法导入。需不需要把命名空间文件include进来。再使用yii\web\Controller;。use的作用域是什么?

  • 回复于 2015-11-11 14:14 举报

    我先占位 我来听课

  • 回复于 2015-11-11 14:17 举报

    use 的文件名其实是namespecs预设的名字,这样如果相同文件名可以用namespecs进行分拣啊,use相当于引入

    觉得很赞
  • 回复于 2015-11-11 14:19 举报

    假如说:a.php,定义 namespace yii\a. b.php 里面定义namespace yii\b.我在b.php里面可以使用use yii\a吗?

    如果可以的话,那use 的作用域有多广。

    再比如说:在同一个服务器上有A站和B站两个网站,A站目录下有上面的a.php ,B站目录下有上面的b.php ,还可以在b.php里面使用use yii\a吗?

  • 回复于 2015-11-11 14:20 举报

    好好看下这个,http://php.net/manual/zh/language.namespaces.php

    然后,了解一下php的autoload是怎么一回事,然后,你就明白了...

    1 条回复
    回复于 2015-11-11 14:27 回复

    明白了。谢谢。

  • 回复于 2015-11-11 14:20 举报

    自动加载 spl_autoload_register

  • 回复于 2015-11-11 14:22 举报

    第二个问题是否可以公用,是完全可以的,不同项目是可以公用一个use YII\A的
    第一个问题命名空间的含义有多广?起个ncikname啊 USE其实就是引入,YII1是集成include的

  • 回复于 2015-11-11 14:22 举报

    此问题值得深思!

  • 回复于 2015-11-11 14:25 举报
    return [
      'yii\base\Action' => YII2_PATH . '/base/Action.php',
      'yii\base\ActionEvent' => YII2_PATH . '/base/ActionEvent.php',
      'yii\base\ActionFilter' => YII2_PATH . '/base/ActionFilter.php',
      'yii\base\Application' => YII2_PATH . '/base/Application.php',
      'yii\base\ArrayAccessTrait' => YII2_PATH . '/base/ArrayAccessTrait.php',
      'yii\base\Arrayable' => YII2_PATH . '/base/Arrayable.php',
      'yii\base\ArrayableTrait' => YII2_PATH . '/base/ArrayableTrait.php',
      'yii\base\Behavior' => YII2_PATH . '/base/Behavior.php',
      'yii\base\BootstrapInterface' => YII2_PATH . '/base/BootstrapInterface.php',
      'yii\base\Component' => YII2_PATH . '/base/Component.php',
     ......
    ];
    简单的来说,namespace相当于Yii里面的别名,从上一段return的数组来看,可以把namespace抽象成array的key,然后根据key的值去计算获取value,value就是文件的绝对路径,Yii就帮你include
    
    
    1 条回复
    回复于 2015-11-11 14:26 回复

    这个解释我明白了。

  • 回复于 2015-11-11 14:25 举报

    这个问题好说又不好说

  • 回复于 2015-11-11 15:00 举报

    use的作用我的理解是打破逻辑隔离。
    你想用Controller类,实际上是spl_autoload_register函数注册的方法(BaseYii类的autoload方法)在你想使用这个类的时候先帮你把文件include进来了,include进来之后因为有命名空间的隔离,使用use导入它的命名空间后就可以像以前没有命名空间一样直接拿这个类名直接使用了。

  • 回复于 2015-11-11 15:02 举报

    肯定要引入啊。只不过有自动加载

  • 回复于 2015-11-11 15:04 举报

    如果我就直接把use认为是include,可以吗?会出现什么问题?

  • 回复于 2015-11-11 15:07 举报

    这个问题乍一看 觉得很简单... 天天都在用的东西 这有什么好说的?

    仔细一琢磨, 要想原原本本的说清楚 还真是不知从何说起.

    占坑 晚点有空回答

    一, 第一个问题, 需不需要把文件导入进来?

    答案是 : 需要!

    但是在各种框架内, 你不会直观的感受到这一点, 因为都实现自动加载了.

    早期__autoload 后来 又增强版spl_autoload

    现代框架都是遵循composer自动载入标准完成

    composer的自动加载标准又和namespace结合了起来, 这个后面补充.

    二. 第二个问题, use的作用域是什么, 有多广?

    比如 : 同一个服务器上有A站和B站,A站下A\a ,B站有B\b ,还可以在B\b.php里面use A\a吗?`

    答案是 : 不知道怎么回答了 = =! 只能说和几个站毫无关系...

    在当前请求周期内, 只要先加载到了A\a, 那么随后你都可以use A\a;

    这和几个项目没关系, 和文件摆放位置没关系

    !!! 只和 当前请求内, 你use的时候 有没有事先声明并include进来有关系;

    如果非要说出作用域? 只能看每次请求的实际情况了...

    三. 补充

    在各种现代框架内(遵循了composer标准的)

    一般 只要你use A\a; 就能自动加载进A\a (当然 你确实有声明);

    并不用小心翼翼的担心 我use A\a时候, 有没有include进来呀

    因为composer就是按照namespace来自动加载类的.

    当然并不绝对(未遵循该标准的, composer也提供有自动加载方式)

    具体的标准去查一下资料吧 这里就不说了 已经很啰嗦了

    1 条回复
    回复于 2015-11-11 17:17 回复

    回答得太详细,谢谢你详细的解答。终于搞明白了这个问题。

    , 觉得很赞
您需要登录后才可以回复。登录 | 立即注册