当前位置:Gxlcms > PHP教程 > Yii1x到Yii2x的细节变化

Yii1x到Yii2x的细节变化

时间:2021-07-01 10:21:17 帮助过:36人阅读

Yii2中将表名返回值默认格式是{{%user}}
Yii1中返回的是{{user}}
查看了一下源码,发现,在Yii1

path\to\yii\framework\db\schema\CDbSchema.php line78

if($this->_connection->tablePrefix!==null && strpos($name,'{{')!==false)
            $realName=preg_replace('/\{\{(.*?)\}\}/',$this->_connection->tablePrefix.'$1',$name);
        else
            $realName=$name;

Yii2

path\to\vendor\yiisoft\yii2\db\Connection.php line795

return preg_replace_callback(
        '/(\\{\\{(%?[\w\-\. ]+%?)\\}\\}|\\[\\[([\w\-\. ]+)\\]\\])/',
        function ($matches) {
            if (isset($matches[3])) {
                return $this->quoteColumnName($matches[3]);
            } else {
                return str_replace('%', $this->tablePrefix, $this->quoteTableName($matches[2]));
            }
        },
        $sql
    );

就会发现,不仅调用的类变了,而且就连方法都变了,使用了str_place而不是快过时的prg_replace同时也可以观察到正则表达式的变化,那么新增的后面的%是什么呢?我本以为是后缀,看了半天源码也没有其他的东西,运行一下果然只是简单的替换。意思就是说,每添加一个%就会被替换成一个前缀。可能是作者为了方便其他喜欢添加后缀的人吧。

再看一下后面的正则\\[\\[([\w\-\. ]+)\\]\\]),如果表名是说的[[user]],那么就会调用$this->quoteColumnName($matches[3]);返回的是`user`,在外面套了一个反引号,本生成的sql语句中就已经有了反引号,所以,表名是不能使用[[xxx]]进行嵌套的。

').addClass('pre-numbering').hide(); $(this).addClass('has-numbering').parent().append($numbering); for (i = 1; i <= lines; i++) { $numbering.append($('
  • ').text(i)); }; $numbering.fadeIn(1700); }); });

    以上就介绍了Yii 1x 到 Yii 2x的细节变化,包括了方面的内容,希望对PHP教程有兴趣的朋友有所帮助。

  • 人气教程排行