[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]