Heim  >  Artikel  >  Backend-Entwicklung  >  java - php中同时使用多个use导入命名空间时的问题

java - php中同时使用多个use导入命名空间时的问题

WBOY
WBOYOriginal
2016-07-06 13:51:511029Durchsuche

<code><?php namespace app\models;

use yii\db\ActiveRecord;

class Country extends ActiveRecord
{
}
</code></code>

这是模型类定义代码

<code><?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,
        ]);
    }
}</code>

**这是调用模型类的控制器代码
请问模型类里面明明namespace是app\models,那么为什么控制器里面要use app\models\Country而不是use app\models呢?
这是因为在他之前还有其他use语句还是因为什么?我看了很多关于php命名空间的教程都没讲到过这个问题,求各位大神解答。**

回复内容:

<code><?php namespace app\models;

use yii\db\ActiveRecord;

class Country extends ActiveRecord
{
}
</code></code>

这是模型类定义代码

<code><?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,
        ]);
    }
}</code>

**这是调用模型类的控制器代码
请问模型类里面明明namespace是app\models,那么为什么控制器里面要use app\models\Country而不是use app\models呢?
这是因为在他之前还有其他use语句还是因为什么?我看了很多关于php命名空间的教程都没讲到过这个问题,求各位大神解答。**

php的命名空间是不支持*这种方式的,c#中支持use app.models.*就可以引入model下所有的类,但是php是不支持的(详情要去看autoload方法,看完就明白了),必须要引入到具体的类

<code>namespace Your\Namespace\Name;

use It\Is\Class\Name; //调用这个类,而不是调用一个命名空间
use It\Is\Class\MyClass AS OuterClass; //因为MyClass和声明的类重名,使用AS定义别名

/**
 * 全名 \Your\Namespace\Name\MyClass
 * extend Name 等价于 extend \It\Is\Class\Name,如果你不写use It\Is\Class\Name;这句的话
 */
class MyClass extend Name {

    use Alert; //调用方法
    
    public function demo() {
        $obj = new OuterClass(); //相当于 new \It\Is\Class\MyClass()
        $obj = new Object(); //代表 \Your\Namespace\Name\Object;
        $obj = new Demo\Object(); //代表 Your\Namespace\Name\Demo\Object;
        //根据以上两句你应该明白了,namespace是指明该文件所处的命名空间,如果按照你的理解 use 后面是命名空间的话,那么当前文件就同时隶属于不同的命名空间了,会发生混乱。
    }

}
trait Alert { //全名为\Your\Namespace\Name\Alert

    public function vardump() {
        var_dump($this);
    }
}
$obj = new MyClass();
$obj->vardump();</code>

注意:
php中use是可以引入命名空间或者接口
所以,这里直接引入一个类要方便些。

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn