为什么YIi2使用命名空间不用Include也可以使用外部对象

为什么YIi2使用命名空间不用Include也可以使用外部对象,第1张

你没有理解C++的namespace。如果你熟悉java的话,你可以这样理解,java中用包机制取代了所谓的命名空间。在java中一般是一个类一个文件的(原则上说多个类放一个文件下也没问题),然后相同功能的一组类文件组合成了一个包。

在C++中,namespace就相当于java中的包,单纯的头文件是不需要命名空间的,如果你想把多个类、辅助函数等等组合成一个整体,就用namespace。

命名空间是防止名称碰撞的机制,比如我有一个class A,你也有一个class A,那么我们在同一个程序下的话到底是用你的A还是我的A?在C++中就这样用I::A、Y::A,而java中则是IA,YA

不需要h的头文件,是C++的标准头文件,里面都包含了namespace std,如果是标准出现前的C++头文件,如<iostreamh>这些都不包含namespace,那个时候还没这个概念。新的头文件是标准出现后重写的,防止命名碰撞问题(VC++60是标准之前的编译器,允许使用旧版的头文件,但这些都不包含namespace,而新编译器都不再使用带h的C++标准头文件)如果是C的头文件,如<stdioh>就不包含namespace,C++重写的C的头文件都包含std,名称为<cXXX>,如<cstdio>

至于谁包涵谁的问题就很难说清楚了,因为namespace虽然一般都是用在头文件中的(规范使用是在头文件中),但是一个头文件不一定需要namespace,而且一个namespace可以包涵多个不同头文件。我举个例子:

1

2

3

4

5

6

7

8

9

//file1h

namespace A{

class B{};

}

//file2h

namespace A{

class C{};

}

//class B、C 都属于一个namespace A中,但却分属于不同的头文件

你最后提到mport相当于include,你可以这样认为,但又有不同。首先从2者的实现机制来看,import是引入一个包或者引入包下的某个类文件,include只引入头文件(java中没有头文件,所以是实现和声明一起引入的,C++中实现和头文件是拆开的,include只包含声明部分,实现是由链接器最后链接组成的)

其次 java中的 import 既包含了包的引入,又开放了包的命名。比如import javaswing; 你用JFrame类时就不用写javaxswingFrame了,只要写JFrame;但C++中include只包含了声明的引入,要想开放命名空间需要using指令,如using namespace std 或using std::cout,然后就能直接写 cout了,否则每次都要写std::cout

至于你说的std::相当于Systemout,是完全不对的。因为System是属于javalang这个包下的一个类,而out是类下的一个成员对象。javalang才相当于std::

而cout和print()是有本质区别的,这个你可以看下《C++ primer》或者《C++程序设计语言(十周年纪念版)》(这2本书都对namespace有清楚的解释,建议看一下),我简单解释下吧,以下是简化版本的cout实现:

1

2

3

4

5

6

7

8

9

10

namespace std{

……

class ostream{

……

ostream& operator<<(ostream&,const string&);

……

}

……

ostream cout;

}

简单来说cout已经是一个实例化的对象了,相当于System类下的out,而<<才是他的方法( *** 作符重载),相当于print()。

简单来说 std::cout<<" ";相当于javalangSystemoutprint(“ ”);

(如果要完全等价的话,要把cout 放入class ostream中作为成员,就变成std::ostream::cout<<" ";)

至于std,就是一个标准库。你可以认为是相同功能的类组成一个namespace,但对于一个库来说按功能细分成小的namespace是不合理的,使用相当不便,所以一个库就使用一个namespace,表示属于这个库的集合,和其他不同的库进行区分,比如boost库就用boost做namespace,C++大部分库都有自己的命名空间,可以去了解下。

如果是自己编程,就可以按功能定义一个namespace,比如一个Data的namespace,里面可以放Year、Month、Data类等,还有一些辅助函数等等。不必像库一样把功能不同的类也放到一起,然后统一用一个namespace。

把id传入action不就好了吗?

就是保存完毕之后,

return $this->redirect(['shop/detail','id'=>'商品ID');

actionDetail($id)

还是说你有特殊的要求?

YII使用小记-Yii::t()-状态值匹配

1,使用updateCounters()来更新计数器字段。

Book::model()->updateCounters(array('download_count'=>1),':id=id',array(':id'=>$id));

2,使用sendFile()来下载文件。

$type = LFilter::checkString($_GET['t']);

$dataProvider = Book::model()->findByPk($id);

$content = $this->renderPartial('book',array(

'dataProvider' => $dataProvider,

'type' => $type,

),true,false);

Yii::app()->request->sendFile($dataProvider->name''$type,$content);

3,设计数据库时候如果create_time,update_time字段为int(10)在模型中使用行为插件

public function behaviors()

{

return array(

'CTimestampBehavior' => array(

'class' => 'ziibehaviorsCTimestampBehavior',

'createAttribute' => 'create_time',

'updateAttribute' => 'update_time',

)

);

}

4,如果有些字段使用1,2,3之类的数字存储,在程序中使用时候含义不明确。可以model中加入如下函数

private static $_items = array();

public static function loadItems($type,$code=null)

{

self::$_items = array(

'status' => array(

'1' => Yii::t('dh','开启'),

'2' => Yii::t('dh','关闭'),

),

'type' => array(

'1' => Yii::t('dh','产品'),

'2' => Yii::t('dh','文章'),

),

);

return $code self::$_items[$type][$code] : self::$_items[$type];

}

5,多语言使用Yii::t()函数。

新建文件/protected/messages/zh_cn/messagephp内容如下代码

return array('some message'=>'中文信息');

在view文件里如下

echo Yii::t('message','some message');

在config/mainphp里加上:'language'=>'zh_cn',

显示结果就是:'中文信息'。

public function attributeLabels()

{

return array(

'verifyCode'=>Yii::t('default','验证码'),

'name'=>Yii::t('default','名字'),

'email'=>Yii::t('default','邮箱'),

'subject'=>Yii::t('default','标题'),

'body'=>Yii::t('default','内容'),

'required'=>Yii::t('default','变量"{var}"没有定义',array('{var}'=>$var));

);

}

6,数据库表使用了前缀,则使用{{$tableName}}。

public function tableName()

{

return '{{product}}';

7,Cookie的使用

//设置Cookie

$cookie=new C>

以上就是关于为什么YIi2使用命名空间不用Include也可以使用外部对象全部的内容,包括:为什么YIi2使用命名空间不用Include也可以使用外部对象、yii2怎么获取上一条用户提交数据的id、yii2的yii:t怎么使用等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/9488927.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-28
下一篇 2023-04-28

发表评论

登录后才能评论

评论列表(0条)

保存