看了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源码后的一些基本问题的主要内容,如果未能解决你的问题,请参考以下文章

Continous Integration资料

简单的看了看selenium+python后的一些感觉

纯 Git 实现前端 CI/CD

ZooKeeper源码阅读心得分享+源码基本结构+源码环境搭建

ZooKeeper源码阅读心得分享+源码基本结构+源码环境搭建

构建后的测试将在 gitlab-ci 上的新环境中运行