看了CI源码后的一些基本问题
Posted
技术标签:
【中文标题】看了CI源码后的一些基本问题【英文标题】:Some basic questions after looking at the CI sourcecode 【发布时间】:2011-06-07 23:45:09 【问题描述】:我只是在查看 CodeIgniter 源代码,遇到了一些我似乎无法弄清楚的事情;我不确定它们是什么意思,而且由于它们大多像一两个符号,因此很难在 google 和 *** 上搜索它们。
我经常遇到的一件事是:
$this->config =& get_config();
我以前从未真正在 php 中遇到过 =&
(或主要是 &
)。这到底是什么意思?他们是否将get_config
的实例分配给$this->config
?我假设$this->config
来自文件顶部的声明,上面写着var $config = array();
我去寻找get_config()
函数,我找到了以下行:
function &get_config($replace = array())
在这里,我的问题几乎相同:&
代表什么,它有什么作用?我在 CI 核心文件中经常看到这两件事(&
和 =&
)。
我还想知道他们评论的“风格”。每个函数都以注释块开头,下面是一个例子:
/**
* Set HTTP Status Header
*
* @access public
* @param int the status code
* @param string
* @return void
*/
这是由某些插件或库生成的吗?手动执行此操作听起来很麻烦。我还没有检查过像 PHPDoc 这样的东西,但这可能是类似的东西(或 PHPDoc)吗?如果它自动生成它似乎很有用?嘻嘻。
进入下一个问题。我看到不同的函数以下划线为前缀。有明显的__construct
,但也有_set_default_controller();
和_set_routing();
这样的函数,这些下划线有什么特殊含义吗?我知道双下划线用于称为“魔术方法”的东西(我正在考虑__get
和__set
,因为这些是我自己使用过的)。它们有任何“特殊”的技术含义还是纯粹的语义?如果可能,请启发我。
最后但同样重要的是,在控制器核心文件中我看到了这个:
class CI_Controller
private static $instance;
public function __construct()
self::$instance =& $this;
// goes on
这里的兴趣线是self::$instance =& $this;
这是什么意思?它是否将$this
设置为自身的一个实例(猜猜看,哈哈),所以我们可以使用$this?或者这没有任何意义?实际上并没有,因为在非常基本的 MVC 样板中,我将自己用于基本网站,我使用 $this 而没有任何高级的东西。
谁能在这里提供一些见解?我将不胜感激。提前非常感谢。
【问题讨论】:
关于&
(参考)的所有问题:***.com/questions/3737139/…
哦,谢谢。我完全不知道它叫什么,搜索“&”并没有让我走得太远;)我一定会读到的!
这就是该主题的真正用途:无法搜索那种东西:)
【参考方案1】:
关于&
(参考)的所有问题:what-does-this-symbol-mean-in-php(SO)
有关评论块的所有问题,请查看phpDocumentor
有关上述下划线的问题,请查看naming conventions
CI_Controller 看起来像 Singleton
【讨论】:
【参考方案2】:&
用于通过引用传递某些内容,这意味着您对分配给它的变量所做的任何更改都会影响原始变量。它本质上是向它发送内存位置而不是值。
这是php.net documentation 供参考。
例子:
$foo = 'foo';
$bar = &$foo;
$bar = 'bar';
echo($foo);
//Should output "bar"
为什么会有用?
function everythingButFirst($s)
return(substr($s,1));
function everythingButFirstV2(&$s)
$s = substr($s,1);
//First example: Without reference
$str = "abcde";
$str = everythingButFirst($str);
//Will set $str to bcde
//Second example: With reference
$str = "abcde";
everythingButFirstV2($str);
//Will set $str to bdce
你看,它节省了一些打字作业。调用函数比调用函数并将其分配给变量要容易得多。
【讨论】:
有点像 C 中用于指针的 &?有点困惑。 ;( 我对 C 不是很熟悉,但我认为它的用法类似,是的。 所以,只是为了确保我理解这一点:你声明 $foo 并传递一个字符串 'foo' 给它;然后你声明 $bar 并将 $foo 的地址(内存位置)分配给它;那么,当你把 $bar 改成 'bar' 时,它实际上会在 $foo 的内存位置更新它,然后 $foo 会返回 'bar' 因为我们是通过 $bar 引用 &$foo?对吗? 是的。如果你也回显$bar
,它将与$foo
相同。
好的,谢谢。虽然我还没有看到它有什么用,但我想我会去阅读它。非常感谢!【参考方案3】:
&
运算符通过引用分配一个值,这意味着进一步使用此变量将引用 原始 值,而不是分配的值。参考(无双关语):http://php.net/manual/en/language.references.php
cmets 是 phpdoc 样式,它们不是自己生成的,但可以方便地使用 phpdoc 或其他软件创建文档,并在 IDE 中获取预期的参数和返回值。
下划线通常表示方法是private
。在 CI 控制器中使用时,意味着该方法无法通过 url 访问。相关:What's the deal with a leading underscore in PHP class methods?
你说的很对。函数get_instance()
将返回Controller
的$instance
属性。
【讨论】:
谢谢。我会确保查看您提供的链接。我想我现在了解了参考事物的基础知识;不太清楚你为什么会使用它.. buuut 如果它像 C 中的指针,我不明白是有道理的,因为我也不明白;D @cabaret:简单的例子:我分配$foo = 1;
,$bar =& $foo;
,然后增加$foo
。 $bar
现在等于 2,因为它的值引用了原始的 $foo
。
还有 $foo?还是1还是2?因为如果它也是 2,为什么不直接使用 $foo 呢?可能没抓住重点,哈哈。
@cabaret:是的,它们都等于 2。这只是为了帮助您理解参考,而不是一个很好的真实示例。在巨大的 CI 对象的上下文中考虑它,我们通常希望引用原始对象并在它发生变化时进行处理,而不是将对象复制到处于当前状态的新对象。
哦,好的。非常感谢。我去看看文档!感谢您的参与,自从我加入这个网站以来,我从您那里学到了很多 :)以上是关于看了CI源码后的一些基本问题的主要内容,如果未能解决你的问题,请参考以下文章
ZooKeeper源码阅读心得分享+源码基本结构+源码环境搭建