[Powered by Google Translate] [第8条 - 更舒适] [罗布·鲍登 - 哈佛大学] [这是CS50。 - CS50.TV] 这周部分票据将是很短的, 所以我只是要保持对话,你们要不断地问问题, 我们会尝试尽可能填补尽可能多的时间。 很多人认为,这pset的不一定是困难的,但它是很长的。 在pset规范本身需要一个小时来阅读。 我们给你一个你可能需要使用大量的SQL。 我们走你通过它的很多,所以它不应该是太糟糕了。 有没有人开始或完成了吗? 这是最后的pset。哦,我的上帝。 通常有一个JavaScript在此之后,但日历改变的事情 一切较短的1周,我们不再有一个JavaScript的pset。 我不知道它们是如何影响的JavaScript是否会出现在考试中 测验1。 我想它会像你需要知道的关于JavaScript的高层次的东西, 但我怀疑我们刚刚给你直接的JavaScript代码 因为你还没有在它的pset。 但是,这将是下周测验复习的东西。 节的问题。 很多这个东西是有点差劣,但我们将讨论为什么。 不像C,PHP是一个“动态类型”的语言。这是什么意思,你问? 好了,说再见了所有这些字符,浮点数,整数,和其他的关键字,你需要使用 声明变量和函数在C 在PHP中,变量的类型决定,它目前持有的价值。 所以,我们输入这个代码进入一个名为dynamic.php, PHP是动态类型。这是真的。 我不同意的事实,这意味着我们说再见字符,浮点型,整型, 等关键词。 动态类型和替代的确切区别, 这是静态类型的,是动态类型,所有的类型检查和东西 发生在运行时,而静态类型,它发生在编译​​时。 静态的,一般这个词的意思似乎是编译时的事情。 我想有它的其他用途,但在C当你声明一个静态变量, 它的存储分配在编译的时候。 在这里,只是意味着动态类型的 - 在C语言中,如果你尝试添加一个字符串和一个整数,在编译时, 它会抱怨,因为它会说,你可以不加一个int和指针。 这是不是一个有效的操作。 那是另一回事,我们将在第二。 但是,这一类的检查,事实上,它会在编译时, 是静态类型检查。 有语言时,您并不需要说字符型,浮点型,整型,所有这些东西, 但语言从上下文的东西可以告诉它应该是什么类型, 但它仍然是静态类型的。 所以,如果你把51,OCaml的,你永远不需要使用任何类型, 但它仍然会在编译的时候说,你不能这样做,因为你将一个int和一个字符串。 动态类型的,只是意味着在运行期间的某个时候,你会得到一个投诉。 如果您还使用了Java之前,一般情况下,几乎所有的C-型语言 将被静态类型,因此C,C + +,Java中,所有这些都是静态类型的。 在Java中,当你编译的东西,你在说什么 字符串s等于新的东西,是不是一个字符串, 的抱怨,因为这些类型的不匹配。 这是在编译的时候会抱怨。 但它也有一定的动态之类的东西,如果你投的东西 的类型,更重要的是其目前的具体类型, 没有什么可以在编译时检查是否该投是会成功的。 Java也有一些动态类型检查,尽快,因为它得到该行的代码 它实际上执行时,它会做演员, 检查是有效的,如果强制摆在首位, ,如果不是,那么它会抱怨,你有一个无效的类型。 动态类型检查。 输入到一个称为dynamic.php的文件。 Dynamic.php。 我会解压缩的格式。 我们有一个变量,我们将它设置为整数7, 然后,我们将打印和%s - 哦,我们要打印的类型,这样的getType返回类型的变量。 我们只是印刷的类型,一遍又一遍。 我们只是php.dynamic.php。 我们将看到,它的变化从整数到字符串,布尔,我们去通过。 在C语言中没有布尔数据类型,有没有字符串数据类型。 char *和布尔往往​​是int或char或东西。 在PHP中,这些类型的存在,这是一个大的优势,PHP比C - 在PHP字符串操作是无限更容易比他们只是工作。 因此,我们回来这里。 我们跑了dynamic.php。 这告诉PHP解释器,名为php,在dynamic.php运行PHP代码。 如果您有任何文件中的错误,解释器会告诉你的! 解释器,这是一个很大的区别PHP和C 在C语言中,你必须编译的东西,然后你运行编译后的文件。 在PHP中,你永远不会编译任何东西。 因此,PHP解释器基本上只是读这条线的线。 它击中变种= 7,然后它击中printf的然后它击中变种然后它击中printf和等。 有位编译它,和它缓存的结果 所以,如果你运行该脚本后,你可以做一些, 但基本上是一条线,线之类的事情。 这意味着,大量的优化,我们在C, 类似编译,它只是一般的编译器可以为你做了很多的技巧。 它可以使用的变量,它可以做所有这些事情, 它可以做尾递归。 在PHP中,你是不会得到这种优势 因为它只是要开始执行的一行行, ,它并没有真正认识到这些东西一样容易 因为它不是大编译通过的东西,然后执行; 它只是一行行。 这样的解释。 回到我们的动态类型:很酷,不是吗? 你绝对不能做,在C! 现在,看看你能不能找出下列值中的每一个类型的。 见,以供参考。 因此,3.50元。你认为将是什么类型? 下面是我们的类型。 我们有bool值,整数,浮点数,字符串,数组,对象, 和资源,这是一种模糊的。 我认为这实际上是一个例子。 再有就是NULL。 NULL是一个特殊的类型。 不像C,其中NULL只是一个指针的地址为0, 在PHP中,NULL是它自己的类型,该类型的唯一有效的东西是NULL。 这是更为有用的错误检查。 在C语言中,我们有这个问题,如果你返回NULL, 这是否意味着你返回一个NULL指针或NULL表示错误 所有的混乱,我们在一个点上。 这里,返回NULL意味着错误。 很多事情的错误也返回false。 但有一点是NULL类型,唯一的NULL类型是NULL。 然后的回调是像你可以定义一些匿名函数。 你没有给函数的名称,但你不会在这​​里处理。 寻找的类型,他们希望我们知道, 你认为3.50的类型是什么? >> [学生]持股量。 是啊。 那么,在这里,有什么你认为的类型是什么? >> [学生]数组。 是啊。第一个是浮动的,第二个是一个数组。 请注意,这个数组是不是像一个C数组 你有索引0有一定的价值,指数有一定的价值。 这里的指数分别为a,b,和c的值是1,2,和3。 在PHP中是一个关联数组没有什么区别,只是一个普通的阵列 ,你会觉得它在C. 仅仅是这一点,引擎盖下的一个普​​通的数组仅仅是一个关联数组 0映射到一定的价值以同样的方式映射到一定的价值。 出于这个原因,PHP是非常糟糕的代码/基准的东西真快 因为在C:当你使用一个数组,你知道访问的成员是固定的时间。 在PHP访问的成员是谁知道多少时间? 这也可能是常量,如果它的哈希值正确。 谁知道什么是真正做引擎盖下的吗? 你真的需要看看执行,看看它是如何去处理。 那么FOPEN。 我想在这里让我们看的返回类型是PHP手册FOPEN。 我们看到,在这里你可以看一下PHP手册中的几乎所有功能 这是PHP的手册页。 返回类型是资源。 这就是为什么我看着它,因为我们还没有真正定义资源。 资源的想法,在C你种了一个FILE *或什么的; 在PHP的资源是你的文件*。 这就是你要读,它就是你写。 它通常是外部的,所以它是一个资源,你可以拉东西,扔东西。 最后,是什么类型的NULL吗? >> [学生] NULL。 是啊。因此,唯一的一点是NULL NULL。 NULL NULL。 PHP的类型系统(或好或坏)的一个特点是它能够玩弄类型。 当你写一行PHP代码,结合不同类型的值, PHP会尝试做明智的事情。 尝试下面的几行PHP代码。什么是打印出来呢? 它是你所期望的是什么?为什么或者为什么不呢? 关于PHP的这个事实是什么使得它就是我们所说的弱类型。 弱类型和强类型的, 这些条款有不同的用途, 但大多数人使用弱类型和强类型,意味着这样的事情 (“1”+ 2),该工程。 在C语言中是行不通的。 你能想象这不是工作。 很多人混淆了动态类型和弱类型和静态类型和强类型。 Python是动态类型的语言的另一个例子。 你可以扔周围类型的变量,它会在运行时确定 任何错误的核对。 在Python中,它会执行这一点,它会看到(“1”+ 2); 这将失败,因为它说,你不能添加一个字符串和一个整数。 在PHP中,这仅仅是动态类型的,这会不会失败。 弱类型的事实,它做的事情与类型 没有真正意义必然。 因此,(“1”+ 2)我可以想像,12的字符串,我可以想像它的字符串3, 我可以想像它是整数3。 它不一定是很好的定义,我们可能会看到这里 当我们打印时(“1”+ 2);它可能会最终被不同 比印刷(1 +“2”)。 这往往是,在我看来,变得更糟。 在这里,我们可以尝试这些。 关于PHP的另一个小窍门是,你并不需要实际写入文件。 它运行此命令模式。 所以php-R的,那么我们就可以扔在这里的命令: “打印('1'+ 2);”我会抛出一个新的生产线。 该印刷3。 它看起来就像是打印,它是整数3。 所以,现在让我们尝试其他方式: “打印(1 + '2'); 我们得到了3个,并且它也将是整数3?老实说,我不知道。 这看起来是一致的。 从来就没有什么机会,它是字符串的12或类似的东西, 因为PHP不同,JavaScript和Java太, 有单独操作串联的。 PHP级联点。 所以,印刷业(1 '2');是要给我们12。 这往往会导致混乱,人们尝试做这样的事情STR + = 一些其他的事情,他们希望添加到它们的字符串的结束,而这要失败的。 你需要做的STR。 所以,不要忘了串联PHP点。 尝试其他的事情:打印(“CS”+ 50); 我告诉你,是没有希望的,这导致CS50 由于串联是不+。 你怎么看这是怎么回事结束了吗? 老实说,我完全不知道。 它看起来就像是只有50。 它把字符串,我敢打赌,如果我们把123CS - 它看到的第一个字符串,它会尝试读取一个整数或一个号码。 在这种情况下它看到123CS。 “这并没有多大意义,一个整数,所以我只是要想到123。” 因此123 + 50将是173。 在这里,它开始读这是一个整数。 它没有看到任何东西,所以它只是把它作为0。所以0 + 50将是50。 我假设做同样的事情。 我想99。 是的,因为它要采取的第一个 - 所以99。 (10/7),如果是C,这回来吗? [学生] 1。是的,它会是1,因为10/7除以2的整数。 一个整数除以整数返回一个整数。 它不能返回1点什么,所以它只是将返回1。 开始打印(10/7);它要真正解释说。 这意味着,如果你真的想要做的整数四舍五入之类的东西, 你需要做的打印楼(10/7); 在C语言中,它可能是奇怪的,你可以经常依靠整数截断, 但是在PHP中,你不能因为它会自动把它转化成一个Float。 (7 +真),你认为这将是吗? 我猜,如果它要解释真正为1。 它看起来像它的8。 因此,在过去的10分钟,你绝对不会做任何事情,我们已经做了。 你会看到,这样做的代码。 它不具有的那样简单,因为这。 你可以有2个变量,1个变量恰好是一个字符串 和其他变量发生是一个int,然后再添加这些变量。 由于PHP是动态类型的,它不会做任何类型检查 并且由于它是弱类型的,因为它会自动把这些东西一起 一切都只是工作,这是困难的,甚至知道,此变量必须是一个字符串, 所以我不应该将它添加到这个变量,它是一个整数。 最好的做法是,如果一个变量是一个字符串,永远保持它作为一个字符串。 如果一个变量是一个int,将它作为一个int,直到永远。 如果你要处理整数和字符串, ,您可以使用varsint的 - 这是JavaScript的。 INTVAL。我做这一切的时候。 PHP和JavaScript,我混合了一切。 因此,INTVAL是要返回的整数变量的值。 如果我们通过在“打印(INTVAL('123')); 123。 INTVAL本身不会对我们来说,它是专门为整数做检查。 PHP手册,有这么多的功能, 所以在这里,我想我会用is_numeric第一。 我猜,返回false。 这是另一回事,我们去了是===。 is_numeric('123df),你不会想到,作为is_numeric。 在C中,你就必须遍历所有字符 和检查,如果每一个字符是数字或什么的。 这里is_numeric对我们来说要做到这一点, 它的返回false。 所以,当我打印的,打印什么都没有,所以我在这里比较看, 你这样是假的吗?所以现在的印刷1。 显然,它打印1为真,而不是打印真正为真。 我不知道如果我这样做的print_r。不,它依然是1。 让我们回到=== ==仍然存在, 如果你跟汤米,他会说==是完全没有问题的。 我会说,==是可怕的,你不应该使用==。 不同的是,==比较的东西 它可以是真实的,即使他们是不一样的类型, 而===比较的东西,首先检查它们是同一类型的吗? 是。好了,现在我要看看他们实际的比较是相等的。 你得到奇怪的事情,比如10等于 - 让我们来看看,说什么。 因此,('10'== '1 E1'); 这则返回true。 没有任何人有任何猜测为什么返回true? 它不仅仅是关于该。也许,这是一个提示。 但如果我改变的f - 实在可恨!我一直在使用双引号。 双引号骂我的原因是因为我已经把这个双引号括起来。 所以,我可以在这里逃脱的双引号,但单引号更容易。 因此,('10'== '1 F1');打印不正确的。 ('10'== '1 E1');打印出真实的。 [学生]是十六进制? >>这是不是十六进制,但它很接近,它就像 - 1E1,科学记数法。 承认1E1为1 * 10 ^ 1或什么的。 这些都是平等的整数。 如果我们这样做===那么它会是假的。 如果我们这样做,其实我不知道==什么(10和'10abc“);好的。所以,这是事实。 所以就像当你做(10 + '10abc),这将是20, 在这里(10 == '10abc)的,是真实的。 更糟糕的是类的东西(假== NULL);是真实的 或(假== 0);是真实的,(假== []); 有奇怪的箱子 - 这些奇怪的情况下,这是一个。 请注意,(假== []);是真实的。 (0 == FALSE);是真实的。 (0 == []);是假的。 所以==是没有办法传递的。 一个可以是等于b,a可​​以是等于c, 但B可能不等于c。 这是我所憎恶的,你应该总是使用===。 [学生]:我们可以做的!==呢? >> [鲍登]是的。 相当于将=和!==。 这实际上是在pset规范 那里有很多的函数的返回值 - PHP手册是良好的。 它把一个红色的大盒子,“这将返回false,如果有一个错误。” 但返回,返回0是一个完全合理的事情。 想想任何函数返回一个整数。 比方说,此功能在一个文件或东西应该算的行数。 在正常情况下,这个函数传递一个文件 和它的要返回的整数表示的行数。 所以0是一个非常合理的数字,如果该文件是空的。 但是,如果你把它传递一个无效的文件和功能发生了返回false 如果你传递一个无效的文件吗? 如果你只是做==你不区分无效的文件和空文件的情况下。 始终使用===。 这是所有这一切。 在PHP中,你已经习惯了在C数组类型是不同的 事实上,你可能已经注意到了这一点,当你看到这是数组类型。 括号的语法是新的,这是最新版本的PHP PHP 5.4。 在此之前,你总是写阵列('A' - > 1,'B' - > 2。 这是一个数组的构造函数。 现在,PHP终于回过头漂亮的只有方括号的语法, 这仅仅是如此明显优于阵列。 但是,考虑到PHP 5.4是最新的版本, 你可能会遇到的地方,甚至没有PHP 5.3。 在这个夏天,我们遇到了这个问题,PHP 5.3是我们在设备上, 但服务器,我们部署我们的成绩簿,并提交所有的东西 PHP 5.4。 不知道这一点,我们开发了5.3,推到5.4, 现在所有的突然没有我们的代码工作 因为有发生了变化,在5.3和5.4之间 这是不向后兼容, 我们必须去解决我们的东西,不工作的PHP 5.4。 对于这个类,家电确实有PHP 5.4, 这是完全正常的使用方括号。 但是,如果你正在寻找的东西在互联网, 如果你正在寻找的某种阵列东西,最有可能的是,你会看到 拼出来的数组构造函数的语法以来,一直以来PHP诞生 在过去的几个月一直围绕和方括号的语法 或当5.4来了。 这是你的索引。 就像在C,你将如何达阵[0],$数组[1],[2],阵列的方括号,如指数 指数相同的方式,如果你碰巧有你的指数是字符串。 所以数组[''],数组['B']。 $阵列[B]。为什么这是错的? 它可能会产生一个警告,但仍能正常工作。 PHP容易做到这一点。 它往往只是,“我要警告你,但我只是要继续 “,并尽我所能。” 它可能会转化为一个字符串, 但它是可能的,在一些点在过去有人所述 定义b为'HELLO WORLD“。 所以,现在b可以是一个常数,数组[B]其实做'HELLO WORLD“。 我认为在这一点上,或者至少是我们的PHP设置, 如果您尝试对数组的索引键不存在,它将会失败。 我不认为它只是提醒你。 或者至少你可以设置它,以便它不只是提醒你,它只是直失败。 你检查,看看如果确实是这样的索引方式是使用isset。 因此,使用isset($数组['HELLO WORLD'])将返回false。 使用isset($阵列['B'])将返回true。 您可以将这些语法。 我敢肯定,这个阵列会结束 - 我们可以对其进行测试。 哦,我需要PHPWord的。 这是混合您指定的语法,其中的关键是什么 你不指定的关键是什么。 因此,3这里是一个值。 你还没有明确表示其关键是要的。 你认为它的关键将是什么? [学生] 0。 >>我猜只是因为这是第一个我们还没有指定。 事实上,我们可以做一对夫妇的这种情况下。 因此,的print_r打印递归。这将打印整个数组。 这将打印,如果有任何的子数组的数组。 所以的print_r(阵列); php.test.php:: 它看起来像它给了它0。 记住这里有实际的东西,但我们会在第二。 但是,如果我发生,使该指数1,该怎么办呢? PHP不区分字符串的索引和整数索引, 所以在这一点上,我只定义了一个索引1,我可以做都达阵[1],数组['1'] 这将是相同的索引和相同的密钥。 所以,现在你有什么感想3将是吗? >> [学生] 2。 >> [鲍登我猜2。 是啊。这是2。 如果我们这样做是10,这是4?你认为该指数的3个将是什么? 我想11。 我的猜测,什么PHP - 我想我已经看到了这个 - 它只是跟踪最高的数字指标,用它至今是。 这是从来没有要为其分配一个字符串索引3。这将永远是一个数字索引。 因此,它可以跟踪最高的国家之一,它的分配,到目前为止,这正好是10, 这将给予11日至3。 我之前说的,注意的方式是打印这个数组。 它打印键10键,11键,4键d。 甚至让我们做 - 我想我没有把一个0,但它的打印1,2,3,4。 如果我转吗?还是让我们切换这2个。 现在它打印2,1,3,4。 PHP的数组是不是就像你经常哈希表。 这是完全合理的,认为他们是哈希表99%的时间。 但在哈希表是没有意义的事情的顺序插入。 因此,只要将它插入你的哈希表, 假设有没有链表,你可以判断一个链表内 这是第一次插入。 但在这里我们插入2第一,它知道什么时候它打印出该数组是第一位的。 它不把它打印出来,在短短任何顺序。 技术数据结构,它的使用是一个有序的地图, 所以键映射到相应的值,它会记住这些键的顺序插入。 基本上,它的一些并发症,它是讨厌的实际 - 比方说,你有一个阵列0,1,2,3,4,5 你要拿出指数2。 这样做的一个方式,让我们来看看是什么样子。 0,2,1,3,4。 未设置发生未设置变量和数组的索引。 所以,用unset($阵列[2]); 现在这是什么的样子?二是刚刚过去,所以这是完全正常的。 更可气的是,如果你想要的东西,其实是像一个数组。 我会把随机数。 现在发现我的指标。 我希望它只是像一个C数组是从0到length - 1 我可以遍历它是这样的。 但取消设置的第二个索引,什么是指数3,只要我现在不成为指数2。 相反,它只是删除该索引,而现在你去0,1,3,4。 这是完全合理的。 这只是恼人的,你所要做的事情,比如阵列拼接。是啊。 [学生]会发生什么,如果你有一个for循环 你想要去的所有元素? 2,当它击中了它会产生永远不会消失? 遍历数组。有2种方式,你可以做到这一点。 您可以使用常规的for循环。 这又是一个复杂的PHP。 大多数语言中,我会说,有某种长度,len或东西 指示的长度的一个数组。 在PHP中,它的计数。 所以count($),$ i + +) 让我们只需打印($ [$一]); 注意:未定义抵消:2。 这只是要失败的。 这是原因是,在大多数情况下,你永远需要遍历一个这样的数组。 这可能是一个有点夸张,但你永远需要遍历一个这样的数组 因为PHP提供的foreach语法中的foreach($美元的项目)。 现在,如果我们打印(项目) - 将就此进行讨论它在一秒钟 - 工作完全正常。 foreach是工作的方式,是第一个参数是你遍历数组。 第二个参数,项目,通过for循环的每个通 它要采取的下一个数组中的事情。所以请记住阵列有一个订单。 第一次通过for循环中,项目将是123 那么这将是12,那么这将是13,那么这将是23,那么这将是213。 事情变得很奇怪,当你做类似的foreach。 让我们看看会发生什么,因为你永远不应该这样做。 如果我们用unset($数组[1]); 这是可能的预期。 你遍历这个数组,每一次你注销的第一个索引。 因此,索引0,第一件事情,项目需要的价值为0,所以这将是123。 但里面的循环中,我们未设置索引为1,这样就意味着12已经一去不复返了。 因此,打印。 PHP_EOL。 PHP_EOL是刚换行的,但它在技术上更便携 因为换行符在Windows在Mac和UNIX的换行符是不同的。 在Windows换行符\ r \ n,而在其他地方往往只是\ n。 PHP_EOL配置,使其使用任何你的系统是换行。 打印。让我们在最后的print_r($阵列)。 我不知道,这将是的行为。 物品仍然需要,即使我们取消设置之前,我们得从数组中的值12。 不要把我的话,但它看起来像的foreach的数组创建一个副本 然后项后,该副本的所有值。 所以,即使你修改数组内的循环, 它不会在意的。项目将采取的原始值。 让我们尝试注销。 如果这是数组[1] =“你好”; 尽管我们将“Hello”到数组里,项目从来没有考虑该值。 还有另一种语法foreach循环 你把箭头分离的2个变量。 该第一变量将是该值的键, 和这个第二可变将是相同的确切资料。 这是无趣的,但如果我们回到我们原来的情况下,'A' - > 1, 'b'的 - > 1, 在这里,如果我们只是遍历为每个数组作为项目,项目将是每一次。 但是,如果我们也想知道与该项目相关的关键 然后,我们做美元的关键 - >项目。 所以,现在我们可以做打印($关键。“:”。 现在,它的遍历和打印每个键及其关联的值。 我们可以在foreach循环是一个额外的东西,你可能会看到这个语法。 &符号变量名前往往是PHP如何做参考。 如果引用是非常类似的指针, 你没有指针,所以你永远不会直接处理内存。 但是,你有1变量指的是同样的事情,另一个变量的引用。 内部,在这里,让我们做$项目。让我们回到1,10。 让我们做项目+ +中仍存在PHP。你仍然可以做+ +。 php.test.php。我要打印出来。的print_r($阵列); 我们打​​印2,11。 如果我刚刚做的foreach($ $项目)项目将值1 第一次通过循环。这将增加1到2,然后我们就大功告成了。 那么它会通过第二次的循环,该项目是10个。 它增加项目至11日,然后这只是扔掉。 然后,我们的print_r($阵列),让我们看看,这仅仅是1,10。 所以,我们所做的就是失去的增量。 但foreach($美元阵列为&$项) 现在,这个项目是相同的项目在这里。这是同样的事情。 所以项目+ +修改阵列0。 基本上,你也可以做$ K - > $项目,你可以做$阵列[K] + +; 因此,另一种方式这样做,我们可以自由修改项目, 但不会修改我们的原始数组。 但是,如果我们使用k,这是我们的关键,那么我们就可以到我们的数组索引使用该密钥 和增量。 这更直接地改变我们原来的数组。 你甚至可以这样做,如果由于某种原因,你想要修改的能力 - 其实,这是完全合理的。 你不想写阵列[$ K] + +, 你只是想写美元项目+ +,但是你仍然想要说的话($ K ==='A') 然后增加项目,然后打印我们的数组。 所以,我们现在该怎么办的print_r做?应印有什么样的价值观? [学生] 2和10。 >> [鲍登]如果其中的关键是一个'我们实际打印。 你可能很少,如果有的话,将需要定义函数在PHP中, 但你可能会看到类似的东西,你定义了一个类似的功能任何功能。 通常,你会说($ foo的吧),然后确定它是什么。 但如果我这样做,那么这意味着,无论要求什么, 任何调用baz,将第一个参数传递给巴兹是可以改变的。 让我们做$ foo的+ +; 内,在这里让我们做巴兹(项目); 现在,我们调用一个函数。 参考的参数,这意味着如果我们修改 我们要修改的东西传入 打印此我们所期望的 - 除非我搞砸了语法 - 我们得到了2,11, 所以,它实际上是递增的。 请注意,我们需要在两个地方引用。 如果我这样做呢?这是什么意思呢? [学生]:这将改变。 >>呀。 项目仅仅是一个数组中的值的副本。 因此,项目将改变为2,但数组['A'将仍然是1。 或者,如果我这样做,该怎么办呢? 现在项目被发送作为复制到巴兹。 因此,复制的说法将增加为2, 但项目本身从未增加了2。 产品阵列支架任何同样的事情, 因此,阵列没有增加。 因此,这两个地方都需要它。 PHP通常是非常聪明的。 你可能会认为我想通过引用传递 - 这实际上是一个pset时的问题。 这是一个questions.txt的事情,它说, 你为什么想通过这个结构的参考? 这个问题的答案是什么呢? [学生]所以你不必复制的东西大。 >>呀。 一个结构可以任意大,而当你作为一个参数传递结构 它需要复制整个结构,把它传递给功能, 而如果你只是传递结构参考 那么它只是需要复制一个4字节的地址作为参数传递给函数。 PHP是一个有点聪明得多。 如果我有一些功能,我传递给它的数组1,000件事情, 这是否意味着它要复制的那些事1000 把它传递到函数吗?它没有马上做到这一点。 如果里面的这个功能,它从来没有真正修改foo的, 因此,如果($ foo的==='你好')返回true。 请注意,我们从来没有真正被修改了这个函数的参数内的, 这意味着,无论是通过为foo从来没有需要复制 是因为它没有修改它。 因此,PHP的工作原理是参数总是通过引用传递 直到你真正尝试对其进行修改。 现在,如果我说的$ foo的+ +;现在,原来的foo的一个副本,修改副本。 这可以节省一些时间。 如果你从来没有接触这个庞大的阵列,你从来没有真正进行修改, 它并不需要,使复印件, 而如果我们只是把这个符号,这意味着它甚至不把它复制 即使你修改它。 这种行为被称为写时拷贝。 你会看到它在其他地方,特别是如果你需要一个操作系统课程。 写时复制是一个非常平常的模式,你并不需要的东西进行复制 除非它实际上是不断变化的。是啊。 [学生]如果你有增量内部测试, 所以只出了1000元将需要改变? 我不太肯定。 我认为这将复制整个事情,但它可能是足够聪明, - 其实,我的想法是想象,我们有一个看起来像这样的数组:数组= [ 然后索引'a'是一个数组中的[1 2 3 4],和索引'b'的,无论是一个数组。 我需要所有这些逗号之间。试想一下,有逗号。 然后'C'的值是3。 好吧。 现在,让我们说,我们做巴兹(数组); 巴兹不以供参考。 所以,$ foo的['C'] + +; 这是一个例子,我们通过数组作为​​参数 然后它被修改特定的数组索引通过递增。 老实说,我不知道PHP是要干什么。 它可以很容易地使整个事情的副本,但如果它的智能, 这将有其独特的价值,它会复制这些键 但仍然可以指向同一个数组1,2,3,4 这仍然可以指向同一个数组。 我的iPad。 我们通过这个数组中,这家伙点,这家伙点[1,2,3,4], 这家伙[34] 现在我们已经将它传递到巴兹,我们正在修改。 如果PHP是智能的,它可以这样做 - 我们仍然有一些内存复制,但如果有这些巨大的嵌套子阵 我们并不需要复制这些。 我不知道这是什么,但我可以想像它这样做。 这也是一个相当大的优势的C PHP。 PHP使生活变得更轻松了很多东西, ,但你绝对不知道它会执行 因为我不知道这些副本的东西时,它的引擎盖下的, 哦,那将会是一个固定的时间复制, 它只是要改变1个指针,它会是一个可笑的困难线性副本吗? 什么,如果它不能找到空间? 是否需要执行垃圾收集得到一些更多的空间? 垃圾收集可以任意长。 在C语言中,你不必担心这些事情。 你给你写的每一行相当多的原因,它是如何去执行。 让我们回头看看这些。 有意思的是,你不必处理散列函数, 链接列表,或类似的东西吗? 由于工作与哈希表是很容易的,现在,这里是一个有趣的益智工作。 打开一个文件名为unique.php,在写一个PHP程序 (也被称为“脚本”)。 我们往往称他们为脚本,如果他们短的东西,你在命令行中运行。 基本上,你没有任何语言,编译,但你要运行的可执行文件 在命令行中,你可以调用可执行脚本。 我也完全可以写一个C程序,这样做, 但我不把它的脚本,因为我第一次编译,然后运行二进制文件。 但这个PHP程序中,我们要调用脚本。 或者,如果我们写的Python或Perl或Node.js的任何事情, 我们会打电话给他们,因为你所有的脚本运行在命令行 但我们不编译它们。 我们能做到这一点很快得到解决。 我们不打算使用argv。让我们通过这个打击。 说它独特,写一个程序。 你可以假设,输入将包含每行一个单词。 其实,ARGV将变得非常简单使用。 unique.php。 第一件事,第一,我们要检查,如果我们已经通过命令行参数。 正如你所期望的argc和argv在C,我们还有那些在PHP。 因此,如果($ ARGC!== 2),那么我将不会处理与打印一条消息或任何。 我就退出,错误代码1。 我还可以返回1。 在PHP中,你很少在这种状态下,我们在哪里 - 通常你在一个函数中调用一个函数调用的函数调用的函数。 而且,如果出现错误,你只是想完全退出一切, 退出刚刚结束的程序。 这也存在C中 如果你在一个函数中的函数,在函数中的函数 你只想杀程序,你可以调用exit,它只会退出。 但在PHP中更是罕见,我们在这个顶层。 通常我们内部的某种功能,所以我们调用exit 所以,我们不必返回了1件事,然后实现有一个错误 因此,返回,如果承认有错误。 我们不想去面对这一切,所以退出(1); 返回(1),在这种情况下将是等同的。 那么我们要打开我们想要的FOPEN。 参数看起来很相似。 我们要FOPEN($ ARGV [1],我们想打开它的阅读。 返回一个资源,我们要调用f。 这看起来非常相似,如何做,但我们并没有说FILE *。 相反,我们只是说$ F。好吧。 其实,我觉得这甚至给我们一个提示,以PHP函数调用的文件。 PHP文件。 这是什么做的是读取整个文件到一个数组中。 你甚至都不需要FOPEN它。它会为你做的。 因此,$线=文件($ ARGV [1]); 现在,所有的文件的行的行中。现在,我们要排序的行。 我们如何可以排序的行吗? 我们的行进行排序。 现在,我们可以打印出来或者什么的。 也许最简单的方法是的foreach($回声$线线线); [学生]不,我们甚至交叉线通过引用到排序的东西吗? 这是那种会被定义为函数sort($阵列)。 当你调用这个函数,你不把它传递以供参考。 这是的功能定义它,把它作为参考。 其实,这是到底出了什么错 当我们把所有的东西到我们的服务器,我们去的时候,从5.3到5.4。 直到5.4,这是完全合理的。 功能不希望把它作为参考,但你可以把它作为参考 因此,如果不发生修改它,它仍然有修改的。 5.4,你不应该这样做。 所以现在唯一的办法是,如果你通过引用传递明确它的功能。 如果你不想要它,修改它,然后你需要做的$ = $线,并通过复制复制。 所以,现在线将被保留,副本将被改变。 php.unique.php。我可能会弄乱的东西了。 意外的'排序'。 有要的东西,这对我们来说。 它甚至不存在。 请注意,当您阅读本手册的第一个参数是一个数组 和它的所采取的参考。 这是为什么向我抱怨吗?因为我有这样的功能,的排序仍然在这里,我不想。 好了,php.unique.php。我没有传递给它一个说法,因为我没有一个文件。 这是对test.php的php.unique.php。 这里是一个很好的排序顺序打印出来的test.php的。 请注意,排序是一种奇怪的代码文件 因为我们所有的空行是要来首次 然后要来我们所有的1级缩进 然后来我们没有凹陷。 是啊。 >>的源代码[学生]因此,它不是通过引用传递? 一般是按值传递? 波顿当你调用一个函数,它从来没有确定它是否是通过引用传递。 这是确定它是否是通过引用传递函数的定义。 在函数定义的排序,或者只是在看, 它需要的参数,以供参考。 所以,不管你是否希望它把它的参考,它以供参考。 它会修改数组中的地方。 这仅仅是不允许的。你没有做到这一点。 >> [学生]:哦,好吧。 鲍登]这一点,是要采取排序的参考和修改。 再者,如果你不希望它这样做,你可以制作一个副本的排序。 即使在这种情况下,复制是不实际的行的副本。 它只是指出了同样的事情,直到它第一次被修改, 它第一次被修改的排序功能, 的地方,因为它的副本上写的,现在要进行复制的副本。 您也可以做到这一点。这是在其他地方,你可以看到符号。 你看,它在foreach循环中,你会看到它在函数声明中, 你看到它的时候才分配变量。 现在,我们已经这样做一事无成 因为复制和线的字面意思是同样的事情。 您可以使用和复制交替。 你可以做未设置(副本);不未设置线, 你只是失去了同样的事情。 所以,这一点,现在线是唯一的方法,你可以访问行。 有问题吗? 是啊。 [学生]完全偏离主题,但您不必关闭PHP - >>你没有。 好吧。 鲍登我会去尽量说这是不好的做法,将其关闭。 这可能是夸张,尤其是在脚本中, 但让我们看看会发生什么,如果我这样做。 这什么都没做。如果我想 - [叹气] 我需要传递的参数。 拍摄。我把它叫做错误。 参数所以php.unique.php。 现在,我什至都不需要这个。 我会通过一个有效的参数。 这无论是印刷打印。 我在印刷复制和拷贝不存在。所以线。 它打印的每一件事,然后发现这一切垃圾到这里, 因为在PHP什么是PHP标签之外 只是要打印的字面。 这就是为什么HTML,它是如此的好,我可以做格嗒嗒,嗒嗒,嗒嗒类或其他, 等等,等等,等等,然后做一些PHP代码,然后做终端的分区。 而现在印刷这个,我得到我漂亮的分区往上顶,一切PHP印刷,DIV底部。 这样的事情发生灾害时,这是很常见的, 只是一个流浪在底部的文件换行符。 你可能不会想到这将是大不了的 直到你考虑的事实是,与浏览器 - 如何重定向工作或基本任何头的工作, 当你让你连接到一个网站,它发回所有这些报头和活动 像200或响应重定向或任何响应 头是唯一有效的,直到第一个字节的数据被发送。 您可以重定向几千倍,但只要作为第一个字节的数据被发送 你不应该再次重定向。 如果你有一个流浪在底部的文件换行符 比方说,您使用此功能,那么你要 - 比方说,这是另一种的index.php文件,你require_once的东西 - 我不认为它的​​一个很好的例子。 问题发生时,这条线在底部得到呼应。 你什么也不想。 即使你不打算在任何问题上得到呼应,东西都回荡 所以现在你不应该发送任何更多的头文件 你会得到投诉。 你只是不需要那些关闭的标签。 如果你打算做一些与HTML - ,这是完全合理的,在这里做下来格 ,然后在这一点上,你或你可以不包括他们。 这其实并不重要。 但是在PHP脚本中,很少将其关闭。 当一切PHP,绝对好用, 你并不真的需要关闭它/你不应该关闭它。 处理字符串的好得多,比C. 在PHP中,你可以指定一个字符串用单引号或双引号括起来。 用单引号,您不能使用“escape”序列。 不断逃跑,等等,等等,等等。 因此我们知道printf在PHP中是非常罕见的。 我想我会使用printf,如果我想要做的事情 - 在pset中5,你用sprintf或者任何一种。 不过,你想要做001.JPG 002.JPG。 因此,对于诸如此类的事情,其实我想我会用printf来格式化文本。 但是,除此之外,我只想用字符串连接操作。 我从来没有真正使用printf。 我们只是区分单引号和双引号之间的细节。 最大的区别在于,单引号,它会被打印字面上。 没有char数据类型在PHP,C不一样,所以这是相当于。 他们两个字符串。 有关单引号字符串是很好的事情,我可以说'你好,世界!“等等,等等,等等, $ $ WOOO。 会发生什么事,当我打印,这是它会打印出它的字面。 让我们摆脱我们的东西。 所以回声$ str1的; 它的字面打印所有这些事情:美元符号, 反斜杠n,您会觉得这是换行符 - 所有这些东西打印字面上。 你唯一需要转义单引号 因为否则会认为这是结束的单引号。 双引号,完全不同的。 我们已经看到的语法高亮cluing我们去可怕的错误。 php.unique。未定义的变量:WOOO,因为这被解释为变量的Wooo。 双引号,让你插入变量 - 比方说,$名称=“抢”; 所以回声“嗨,我的名字是名字!”; 认识到这一点作为一个变量。 当我运行的 - 我将插入一个新行 - 嗨,我的名字是Rob!和世界你好! 这是因为我从来没有删除上面印刷的Wooo。 有进一步的步骤,你可以做的。 $阵列= [1,2,3]; 如果我要打印第一个索引的数组? 您做$数组[0]。 语法突出显示是一个线索。这是什么怎么办呢? php.unique。 嗨,我的名字是!这不是我想要的。 语法高亮对我撒了谎。 让我们尝试“ - > 1,'B' - > 2。 这是我会怎么写。 意外的单引号(T_ENCAPSED废话,废话,废话,废话,废话)。 我们的想法是,它没有认识到这一点作为阵列的一部分。 它没有认识到这一点作为数组的索引字母a。 你想干什么,大括号, 现在无论是在这个大括号将插, 这是我们到正确的地方,神奇地将这些变量的使用的字。 现在这样做,php.unique,嗨,我的名字是1!果然 “或”嗨,我的名字是Rob! 有一件事,是一种不错的关于单引号是 - 这里也有一些成本插值。 如果使用双引号,解释过这串, 肯定地说,“哦,这里有一个变量,现在我需要去获得这个变量,并将其插入。” 即使你不使用任何变量, 这些双引号里面什么都没有,需要进行插值, 但它仍然会比较慢,因为它需要在双引号 寻找的东西,需要进行插值。 因此,单引号可以快一点,如果没有什么需要进行插值, 我倾向于甚至可以使用单引号,'嗨,我的名字是'。数组['A']了。 这是怎么回事,我们以前是等价的。 但是,这是一个见仁见智的问题。 如果你使用PHP,你可能不关心速度的差异。 没有足够的理他们开始。 任何最后的问题吗? 实际上,我们没有,甚至通过所有的,但这个东西很无聊。 最后一件事,是一种不错的PHP是当你要处理的HTML, 打印变量,你就可以使用它了一下,所以很好的快捷方式语法。 没有让PHP在这里,这就是所谓的短标签。 正式的PHP 5.4,这已经过时了。 建议您把PHP。 这仍然是支持的,这么短的标签<?还是完全没有问题的。 它在默认情况下是支持的,所以您可以使用这些如你所愿,和他们吃起来十分方便。 有什么问题吗? 好的。 保持优雅,圣地亚哥。 [笑] 再见。 [笑] [掌声] [笑] [CS50.TV]