[Powered by Google Translate] [第8条] [舒适]
内特 - 哈迪森] [哈佛大学]
这是CS50。[CS50.TV]
>> 欢迎来到我们的第二个到最后一节。
在这一周中，我们将谈论PHP，然后下周
我们会做一个小小的回顾测验1。
我们要开始第3页的问题设置包，
我们将继续努力通过部分的问题相当迅速。
第3页，我们开始谈论C和PHP之间的这种差别
在这个意义上，PHP是一种动态类型的语言，
而C是静态类型的，
有没有人真的很快做任​​何编码的东西像PHP
或Python或Ruby之前，JavaScript的？
全新的吗？好吧。
>> 我刚才提到的所有这些语言
有很大的不同的语言，如C和C + +和Java
在这个意义上，当你声明一个变量时，你没有申报
它是什么类型的变量，所以在C我们不得不总是说
这将是一个int变量，这将是一个char *变量，
而与PHP，Python和Ruby的，
这些更现代的语言有很多，你没有这样做，在所有。
你只申报的变量，而在PHP的情况下，
你声明一个变量前面加上一个$符号，
然后变量的类型确定的由持有任何值，
这是一种很酷。
要玩这个一点点，我们在这里有PHP代码示例
之间的开始和结束标记。
我们使用的是在这个意义上，这有点像HTML
我们已经得到了这些尖括号这里打开和关闭。
你会看到这一点HTML。
你会看到相同的语法与XML。
>> 这说明一个PHP代码块的开始。
这PHP是特定的PHP。
我们关闭了？以及一切。
让我们打开一个文件可以使用任何你想在我们的设备。
在这个包中，它说叫dynamic.php的。
事实上，你可以把它无论你想要什么，但文件名会
是重要的，所以后来只记得无论你怎么称呼它。
我要切换的设备，
我要创建一个目录
第9条，我相信我们在现在。
我们将进入第9，
我将用gedit。
让我们来看看，gedit的，我现在就打电话给我的dynamic.php。
轰。
在dynamic.php内，因为这是一个PHP文件
我想通过PHP解释器来运行这个
我需要一切重新开始关闭与打开的标签，
所以我要马上启动这些，
给自己一点空间在标签之间的，
这个练习是玩弄
这个函数调用的getType，这样的getType，这个功能在这里。
>> 请注意，有没有下划线或空格或连字符或类似的东西
分离的2个字，然后键入，只有一个词完全。
但是，这是什么做的是，如果我通过在一个变量中的getType，
说是$ var $ X，
这会告诉我在调试格式
该类型的名称是什么。
我们将在这里进行试验。
特别是，如果你回头看看在pset规范
我们这里有几个不同的代码行。
我们在第一行代码初始化这个变量，$ var的，
等于7，然后我们有这个printf线
说哎，printf的变种是空白。
printf是一个在许多方面我们可以打印的东西在PHP。
通常，你会看到的回声代替了printf函数，
但输出，我们都熟悉的已编码在C一段时间。
你其实可以做的是，让我们来看看，如果复制和粘贴工程。
我要试试这个。
我们会回去的设备。
好了，我们走吧。
间距是有点古怪，但在这里，我们走了。
在这里，我们已经得到这个代码。
>> [学生]：它没有良好的作风选项卡中吗？
你说什么？
[学生]：常规选项卡中吗？
对，所以山姆问，如果是公约的选项卡或不。
通常情况下是肯定的。
在这种情况下，我选择了不。
老实说，你会看到不同的东西，不同的程序员。
通常经常使用的PHP与HTML相结合
和其他语言，所以有时印刷看起来有点时髦
如果你在PHP开始和结束标记的缩进。
这真的视情况而定。
在这种情况下，复制和粘贴没贴的标签，对我来说，
但它绝对不会像你说的，使更清晰。
好吧，如果你这段代码保存在dynamic.php
然后你可以做什么，回落到终端窗口，我就在这里
在gedit中，相当于做编译
使用make，然后运行你的代码，在C
所有你必须​​做的PHP文件是启动PHP解释器，
这是一个小程序调用PHP，
你给的解释，争论的焦点是你想要的文件解释。
在这种情况下，dynamic.php。
哎呀，我把它放在了吗？
哦，我把它在第9，和我在这里。这就是为什么。
>> 如果我现在，再次运行
我们看到，在我的第一个GetType函数调用
var是一个整数。
在接下来的一个var是一个字符串，然后在第三个变种是一个布尔值。
有什么有趣的，如果我们向后滚动，我们看到，
这些都是类似的，我们已经在C.类型
我们有整数在C
我们有字符串在C，
所以字符串是不是在这个意义上的完全合法的类型
我们的CS50的字符串是真的什么？
你说什么？大小姐吗？
[大小姐] CHAR *。
是啊，是我们的char *。
在学期开始的时候，我们使用的字符串类型，
但这确实是一个char *引擎盖下。
我们刚刚定义的类型，而在PHP中，这些字符串是一个实际的类型。
有没有更多的这char *类型的东西。
>> 你会看到，我们可以做更多的事情与字符串
更容易在PHP比我们在C，
然后终于，我们有这样的布尔类型，与这里最大的区别是，
如果我们滚动回落，我们看到，这些类型的名称
是整数，字符串和布尔值的，而不是整型和bool
你拿起不同的编程语言，
假设在一些点在你的生命中，你会接触到
不同的人，你会发现像这样的小怪癖
其中，C调用整数int类型。
有人称之为整数。
还有其他的条件，你会碰到。
大整数，我们今天看到的SQL。
也有号码，然后布尔型，布尔型，
所有各种差异有。
>> 这是非常有趣的，但是现在，我去给你一点点的时间，
如果我们放大的工作，通过这个练习在第3页的底部
在要求什么类型对应于这些值在底部。
我们有3.50。
我们有这样的事情就在这里，这是有趣的。
我们还没有看到过，但如果你一直跟着在讲座
你可能已经知道那是什么。
然后，我们有这样的，这是一种时髦的。
您承认这一点。
在C这是什么吗？
山姆？这给你在C？
这将打开一个称为dynamic.php的文件，并使其可读。
是啊，会是什么类型的变量，我们将分配？明星>>文件。
没错，我们会分配到一个文件中的明星。
这是合法的PHP。
运行。看看会发生什么时，其传递到的getType。
然后还要检查null是什么，是什么可能是在PHP。
我给你一两分钟。
你可以从字面上复制和粘贴这些值，
然后我们会做一个小的随机呼叫您
看你得到了什么。
>> [学生]：我有一个问题。“是啊。
在一次演讲的大卫说有什么东西，你可以把你的文件的顶部
所以，你不必每次输入PHP。
那是什么？
他可能是在谈论磅砰，哈希爆炸。
这是一个指令，如果你标记你的文件，可执行文件
那么它的作用是当你执行该文件时，
它会告诉shell程序
使用PHP解释器来解释该文件的内容。
问题是，这个特殊的线是什么
我们可以纳入我们的PHP文件的顶部没有包括
这个PHP线或本的PHP命令时，我们要执行的文件吗？
实际上，你可以做到这一点了一堆不同的文件。
我认为这取决于PHP二进制文件存储在哪里，
但往往usr / bin中/ PHP是一个良好的开端。
您可以明白这一点正是由会回落到您的设备
输入PHP。
哪个命令时，你正在执行的二进制
相应的文件或命令。
这告诉我，PHP是真的走样二进制文件
是存储在usr / bin中，这是那里有很多的系统的二进制文件的安装。
例如，如果我滚动到顶部，现在我已经把这个＃！在这里
我可以向下滚动，我可以尝试运行
的dynamic.php，但我得到这个错误被拒绝的权限，
是什么意思的是，该文件目前尚未提供可执行权限。
它未标记为一个文件，有人可以运行。
>> 当你运行make或铿锵，你有一个可执行文件
编译器足够聪明，知道，嘿，我建立一个可执行文件。
您可能要执行的，所以它会自动配置
你的权限。
虽然，这是没有的情况下，当你从头开始创建一个正常的文件，
原因通常你不希望有任何文件在您的系统上的可执行文件，
所以你确实有去和手动做到这一点。
做到这一点最简单的方法是使用chmod命令，
使用chmod + x表示添加的可执行位
因为有读位，写入位的可执行位，
R，w，和x，
并说使用chmod + x打开的可执行位
为然后文件我们指定在这种情况下，这将是dynamic.php。
>> [学生]：是，转身就为大家吗？
让我们检查了这一点，因此，如何将我检查的权限吗？
你知不知道我怎么会检查，以查看权限的文件吗？
[听不见的学生反应]
你说什么？>> [学生]：XSD。
XSD为我们提供了黑客中的文件。
列出所有的文件，L，会告诉我我的目录中的所有文件
种在长期，详细列表，所以在这里我们可以看到，
这dynamic.php文件
11月5日的最后修订在4:21 PM。
这个文件的所有者是jharvard。
这是用户登录
这是我工作的用户，
如果你在家电，你也工作用户jharvard。
你在学生群体中，
这些事情，你会经常看到。
>> 我们可以在这里投入了大量的细节，
但在大多数情况下，你想看看什么当你想看看
不是一个文件是否是可执行的主要是
谁拥有该文件的用户，所有者，
所以这的jharvard，然后我们有
在这里在左边的权限位，
的方式来阅读，这是最后一位
通常被用于标记是否未至少在这种情况下
这最后一点往往会被设置为广告显示
该文件是一个目录，而不是只是一个普通的文件。
以下3位在这里
确定文件所有者的权限，
所以在这种情况jharvard，作为该文件的所有者，可以读取和写入这个文件，
但有一个破折号说，jharvard无法执行此文件。
接下来的3位组，所以这是学生群体，
因此，如果有多个用户我的产品，
我们有多个用户的学生组的一部分，
他们都可以读取这个文件，但不能写，
同样，任何人都，世界
只能读取这个文件。
关于这是一个良好的，长期的书面记录，
这样你就可以在线阅读。
问题集规格，我们进入更详细。
>> [学生] 218指的是世界吗？
218，我忘了，离我的头顶部
但没有。
让我们来看看。我消隐上是正确的。
回到我们做这个使用chmod + x
在这里我们想，给dynamic.php的可执行权限，
问题是，这是否会给可执行文件的权限，每个人都
或只是jharvard，我们可以看到这一点
执行上面的命令，并输入ls-l，
现在我们看到它标记为可执行。
你可以看到，有颜色的变化。
现在dynamic.php被列为绿色，
它看起来像这个问题的答案是什么，夏洛特？
夏洛特] jharvard。>> jharvard，是的。
>> 如果我们想为大家打开可执行位
我们是如何做到这一点呢？
有什么想法？>> A + X？
是的，没错。
夏洛特说，我们所能做的属性A + X的dynamic.php，
现在如果我们运行ls-l我们可以看到，可执行位
确实就为大家打开。
实际上，你可以做反向，所以你可以把它关掉为大家
使用负。
现在，它的关闭，现在我们可以把它为jharvard
所以，我们实际上可以运行它，现在，
现在你看到的，当我们运行这个特殊的代码＃！的顶行，
＃！线，告诉外壳，
告诉我们的终端哎，这个文件运行时，
使用/ usr / bin中/ PHP来解释这个文件
然后打印输出。
[听不见的学生问题]
当然，让我向后滚动。就这样。
你会看到所有的这些指令开始的这一磅，然后惊叹号，
有时也被称为一个家当，哈希爆炸。
>> [学生]：我们可以运行它与PHP dynamic.php前，我们把它变成可执行？
问题是我们如何可以运行使用PHP二进制
，而dynamic.php是不可执行文件？
这是超级重要的，因为这正是
它在工作的时候你写的习题集7。
大部分的时间PHP文件不是直接执行的。
可行的方式，是因为它是PHP二进制文件的可执行文件。
翻译是正在执行的东西，
所以它在做什么是真正的slurping是在整个内容
我们dynamic.php文件，一行行
执行这些命令，所以它的使用我们的PHP文件
作为指令的列表。
它不直接执行它。
这就是我们说，这些文件在运行时解释。
这是一个运行时的语言，而不是在编译时确定的东西是，
不是编译性语言比如C。
>> 是否有一种方式来获得运行时语言，行动，如果它是一个编译时语言，
就像如果你把所有的运行在服务器上完成
，而不是你知道我的意思吗？
是的，所以问题是，
有一种方式来获得运行时的语言更像编译时类型的语言吗？
还有，我的意思是，这是一个活跃的研究领域，这些公司的很多。
我相信，Facebook已经做了很多工作，PHP
并编译它，使其速度更快，优化
因为他们的网站是建立在PHP。
如果你已经node.js的一切，
这是一种一个JavaScript解释器
能够运行JavaScript的浏览器之外，您的Web浏览器之外，
因为传统JavaScript的只是内部运行的Firefox或Chrome浏览器，
，而且将被用来使很酷的动画在网页上发生
使你的网页动态。
这是谷歌做了很多工作，是建立在
让JavaScript和C + +
结合在一起，所以有很多活跃的研究领域，以
这些语言交互，并对其进行优化，
主要是因为这么多的人可以在PHP和JavaScript代码
因为它是一个非常容易。
这是一个非常和蔼。你没有指针。
您不必四处飘荡的类型。
他们希望获得的好处，这些编译时语言
与所有类型检查的速度和更低的内存使用率和所有的
同时仍然保持使用这些新的灵活性和易用性。
>> 回到我们原来的计划的攻击。
我们已经获得了一些对这些问题，在这里我们的问题集规格。
让我们通过他们真的很快，我们会在房间里。
夏洛特，是什么类型的3.50？
[夏洛特]这是一个双重的。>>这是一个双。
吉米，什么是下一个吗？>>阵列。
一个数组，真棒，和Jared的fopen是什么？
[贾里德这是一个资源。>>这是一个资源。
这是一种新的，而不是一个文件明星，而不是一个文件。
这是一个资源类型是在PHP，
对不起，ELLA，最后空是什么？
空。
空，它是如何拼写的PHP？>>用同样的方法。
用同样的方法，资金吗？>>呀。
是啊，所有的权利。
在这里，我们走了，我们已经得到了一个双重的，我们已经有了一个阵列，
我们已经有了一个资源，然后我们已经得到了空。
现在让我们来看看你见过
让我们来看看，所以现在我想，我也希望做的是拉
此网页在这里，php.net /手动，
所以，如果你们复制，打开Web浏览器。
我要拉了Chrome浏览器，，在。
我想告诉你这不仅仅是因为
我们可以谈论所有天左右，类型和所有有趣的东西
而是因为这是PHP手册，
有很多PHP程序员在那里。
在那里有很多的PHP网站，
，因此，有大量的文档，PHP，
和手册，这php.net，是一个很好的地方去
每当你遇到的问题，什么是最好的方式在PHP做X
什么是一个功能是什么样子？
只是一种熟悉，这看起来像什么，因为
你会来到这里的时候，一个位问题7。
>> 如果你最终做最后的项目，使用PHP
这将是一个地方，你会变得非常熟悉。
通常情况下，人们能做到这一点的是，他们使用谷歌搜索的网站，
他们不使用的搜索框，在这里的右上角，这是一种微小的。
如果你在谷歌搜索周围用PHP做的东西，你会看到
本手册的链接弹出，通常可以依靠
作为一个相当不错的资源。
真棒，做出来的这些类型，只是出于好奇，
哪些我们没有见过？
我们还没有看到这里的内容吗？
[学生]：资源。我们看到了资源与fopen的调用。
[学生]：对象。对象是肯定的，我们还没有看到。
回调我们还没有看到。
有一些这些伪类型。
我们确实只看到了整数和双。
我们没有看到一些其他的，所以如果我们点击整数
我们可以看到的是，他们在这里有任何其他的整数？
难道他们全都是这样的整数，整数，整数。
有些语言有更大的整数类型，
就像我们今天在MySQL中看到的是int，然后大整数。
酷。
>> 所以，PHP手册。
让我们回到我们的问题的一套规范，我们现在将向下滚动到第4页。
发生的事情，当你收到这些语言之一
没有这个静态类型的语言，所以这些，你必须声明
类型的一个变量了前面
你的情况下，你可能会开始有不同类型的变量
彼此相互作用，
和PHP做这件事情的，它试图做
它认为是最明智的事情
当你有2种不同类型彼此交互的。
例如，如果我们看一下这几行代码在这里
你看，我们已经得到了时会发生什么
我们尝试添加串1的整数2。
会发生什么，如果我们尝试添加一个字符串，它是不是一个数值
而是实际的字符数50，CS吗？
然后我们会看到有不同的情况出现
而不是添加一个字符串到数字，我们要添加一个数字到字符串，
等等等等的地步，我们要
某种奇怪的东西，在这里我们已经得到了7 +真实。
这到底是什么意思呢？
>> 如果你们去一些代码并粘贴到您的设备。
您保持在dynamic.php。
我们将看看会发生什么。
[学生]：只要使用打印，不是printf？
是啊，所以你会发现，也是一个有效的打印功能打印PHP。
有许多不同的方法做这件事。
以后，一旦我们开始谈论我们会看到一对夫妇的例子
唯一的问题是我们要编写的
然后将浓度问题，我们要编写
即使我们有FOPEN和fclose
往往不读取一个文件的内容的最简单的方法。
PHP有很多这些C-遗留下来的。
[学生]：当我把所有的那些东西，我只得到一个数字作为输出。
内特H.]当你把所有这些东西。
让我们来看看它，因为它可能
有一件事是在新的生产线，这些打印调用不会终止。
有没有新的生产线分离每个这些打印电话，
所以，也许你得到一个大的数量，
它实际上只是汞合金的新行字符。
[学生]：好了，怎么我确保
那么，有一堆不同的方式。
你可以手动将在一个新行字符打印，
新行字符的回声，
打印新的生产线。
[学生]：所以回声如printf是一样的东西吗？
>> printf是像C的printf
您要打印的格式化字符串。
你提供的格式字符串，然后所有的占位符变量。
这是经常不使用的东西，
让我们来看看，作为一个声明，
我不太熟悉PHP比我其他的网络语言，
当我在PHP编程，我通常不使用printf
因为我发现它使用的字符串插值功能，它有更快，
我们将去，我会告诉你，在短短一秒钟，
而在C中，我们有做到这一点哈克的事情，得到它的正确打印。
实际上，你可以直接把变量转换成字符串在PHP。
printf是过于长，我通常做的那种。是的，艾拉。
[云裳]一般来说，如果你得到分析错误是什么意思，
像在C，它不会告诉你确切的错误是什么，它​​是，
这是否意味着看看通过整个代码和数字呢？
这是典型的比这更有针对性。
在这种情况下，我认为这是一个有点偏离，
所以，我认为，在这种情况下，我们缺少一个分号。
它试图让一切的感觉，
这样的解释型语言，解释是要尝试
尽最大努力使一切工作适当。
>> 你会看到，例如，在JavaScript中
你会经常行语句结尾的分号，就像他们在PHP中，
就像他们在C.
在JavaScript中的JavaScript解释器
在很多的浏览器会把你在分号
如果你碰巧缺少。
他们会尝试和适应上的一些疏漏。
这可能尝试和努力，并试图把事情的工作，
，然后最后会得到一个点，它说没关系，
我不能让工作想逃，这就是你会得到一个行号
这可能似乎有点偏离的确切地点。
好吧，让我们通过这个真的很快。
我们与Ella，让我们去大小姐，
大小姐，是什么打印的串1加数字2给你吗？
[大小姐] 3。>> 3。
这是否有意义吗？排序的？
它给你一个数字？它给你一个字符串？
[大小姐]一个数字。这是一个数字。
但它的印刷，所以它给你一些字符串排序。
>> 有一件事我们可以做检查了这一点
如果我们这样做是$ var = 1 + 2
那么我们说的getType回声，
因此，我们使用的是第三类印刷在这里。
现在，我们可以看到这里发生的一切。
在这里，我们得到的是我们得到了整数。
即使我们添加字符串到数字，
我们没有得到一个字符串，它只是像大小姐说。
我们得到一个整数。
好吧，让我们来看看，第二天起来，凯文。
CS + 50？>> [凯文] 50。
[内特H.] 50。这是否有意义吗？
[凯文]是啊。
[内特H.]为什么呢？为什么对你有意义吗？
[凯文，因为它只是字符串的数值为零。
是啊，太好了。
这种模棱两可的情况下，但它的好，知道会发生什么。
斯特拉，1 +字符串2号接下来会发生什么？
[斯特拉] 3。>> 3。
在这种情况下，我们得到了一个字符串或数字？
>> 让我们试试这个。
任何人比我更快得到答案？夏洛特？
哦，我没说好了，让我们来看看，我们将做同样的事情
在这里我们已经得到了一个号码加一个字符串，并且我们要响应的类型，
看看我们。
我们还得到一个整数。
不要紧，哪一个是，哪一个是数量的字符串。
我们仍然要得到一个整数。
它仍然会做什么，我们所期望的。
所有的权利，所以Sam，90 + 9瓶啤酒在墙壁上？
[三] 99。>> 99。
没有啤酒瓶在墙上，虽然。
它为我们提供了一些信息发生了什么事。
[三]如果你写的信中
那么你将有90吧？
[内特H.]是啊。
现在的问题是，如果我们写N-I-N-E
我们已经获得了99或90？
我们会得到90。
它实际上只是寻找数字字符。
这是不足够的智慧认识数目字的东西。是。
>> [学生]：是有这样的事情在PHP中类型强制转换？
目前，它是完全相同的方式，你会做的C.
什么关于10/7，夏洛特？
[夏洛特1.4285。
内特H.]是啊，所以可能是什么奇怪呢？
会发生什么，如果你这样做同样的事情，在C，
如果你做了10/7在C？
夏洛特]只会给你，取决于你如何typecasted我想
它会给你只有有限数量的小数点后的位数。
是啊，所以数量有限的小数点后的位数。
还有什么可能将它给你任何小数点后的数字吗？
通常，如此反复，这取决于你如何映射
它可能会或可能不会将它转换到一个浮点数。
在这里，它是一种不错的，它没有。
如果我们你回来的时候我们就开始做这种东西在C
它可能会作出一些更有意义
它不只是去1。
最后，杰米，然后约7 +真实吗？
[杰米] 8。>> 8。
这是什么意思呢？
我猜它只是提供了真正的值为1。
是啊。如果我们改变为false，会发生什么情况呢？
[学生]：7。
是啊，所以请记住，我们谈论这些二进制值，
1，0是关闭？
现在我们有真正的值为1，0是假的，
，你可能没有看到这在C的例子，我们已经做到了这一点过去的学期，
bool类型在C，但在历史上，还没有一个真正的类型，
所以人们用0和1的真假。
这是一个体现的是。
>> 好了，所以这一切的一个重要组成部分
是，我们有这些不同的类型。
它们可以彼此交互。
他们往往可以互相交流的方式很不错的，因为我们在这里看到。
真的很高兴能有串1和2号，加在一起，得到3。
这是有道理的。
然而，当你写的网站，尤其是当你正在处理
用户输入的，所以说你写了一个Web表单
收集来自用户的信息，然后进入处理它
在后端，在你的PHP代码在服务器端
如果你期待值，用户输入并提交
形式是一个整数或浮点数的或类似的东西
你需要明确地将它转换
，然后做一些类型检查。
>> 你不想仅仅依靠这种类型戏法的系统，以使事情成功，
尤其是出于安全考虑，只为您的网站的鲁棒性。
只是要记住，只要你处理表单数据，
任何东西来后或GET和superglobals
请确保您始终验证它，并把它转换和强制转换。
就像我们谈论了一会儿前，类型转换
在PHP是完全一样的，在C，你必须在括号
然后该类型。
记住这一点。
一个功能，将派上用场，当你这样做
我们已经使用，这是一种顺便说一句，
我们一直在使用这个GetType函数在这里
找出一个变量的类型，
，而这是非常方便的进行调试，并看到一个变量的类型是什么
你不希望使用这一点，例如，在一个条件
你检查，看是否是$ var =整数的getType的做一些事情。
这是一个坏，坏，坏。
取而代之的是这些调用的函数是整数，字符串，
是数组，你要使用，所以在这种情况下，
我想这样做，而不是这家伙在这里
是使用的是整数的变种。
他们通常被称为是IS_ *在这个意义上，你可以更换*整数，
字符串，等等，只是非常快的，以确保
这是诠释PHP。
看起来像你可以做的是int或有整数以及？
是的，别名，所以int整数的别名。
酷。
>> 我们要怎么做呢？
让我们加快脚步一点点。
现在，我们要谈谈数组，所以你可以看到
在我们谈论如何在PHP数组的下一个部分的规范
略有不同，它们是在C
事实上，他们的汞合金
你已经认识到，爱在C的阵列
那里的一切是相同的类型的
连续和连续存储在内存中，
你有这些数字指标。
您有索引，索引1，索引2 0，
存储在这些指标的值。
您还可以在C，你写的拼写时，有不少人
做了哈希表的做法，你看到我们在那里有
不同类型的存储，我们映射
一个键的值，所以当你试图存储在哈希表中的东西
你必须指定你想存储与特定键，
和确定该键的位置的值，并在将被存储。
您已经种了这些概念都发生在同一时间在一个PHP数组，
，因此，我们常说这些关联数组
当我们一个键关联的值。
在接下来的部分，我们讲一个简单的PHP数组
在那里我们有键a，b，和c，
所有字符串，映射到整数1，2，和3。
你可以有不同类型的键。
>> 你可以有一些键是字符串，有些键是整数。
你可以有不同类型的值。
你可以有一个值，该值是一个字符串，这是一个整数的值，
值，这个值是一个对象或另一个数组，例如，
在相同的数组对象，这是一种奇怪的。
您不必有一个数组，只是得到了一个类型的元素。
你可以有许多不同的东西在那里。
另外要注意的是，当你看到这样的事情在你的代码，
这是合法的PHP宣布就这样，阵列0，1，2，3，4，5，
将宣布这个数组的初始化改编。
但你实际上得到的引擎盖下是这种隐
键，我们已经得到了0至0，1对1，2 2，3 3代。
而事实证明，即使你做了这样的家伙在这里有一个数组
在那里你有A，B和C的钥匙
然后你开始使用数组push方法开始使用这个数组就像一个堆栈，
所以你可以看到这个数组，这个数组对象，实在是过载。
我们可以使用它作为一个数组。我们可以使用它作为一个哈希表。
我们可以使用它作为一个堆栈。
当你开始推动的事情到这个阵列
你的第一件事情推到这个索引为0，然后索引1索引2。
你可以得到这样的隐式密钥的生成的
除非你明确指定。
你明确指定键的方式，当然，使用这种支架符号，
这是类似于数组除外，而不是只允许
在这里的整数索引，现在我们允许任何东西。
如果你想你的关键，是一个字符串，你会像这样指定。
如果你希望它是一个int，您指定的诠释您要使用的。
>> 的问题上，迄今为止吗？
关于这个想法的好东西之一
是，你永远只能有一个值存储与特定的关键。
如果我们回到我们的设备让我删除了一些这方面的东西。
比方说，我初始化为0，1，2，做一个阵列。
如果我现在知道，例如，如果我echo $到达[0]
我要打印出来的值为0，
因为永远只能是一个值存储为一个特定的键
如果我储存的东西在$改编[0]，说，
后来我才知道，当我echo $改编[0]再次
我不打算打印出来前得到0。
我只是要得到一个。
因此，这基本上是说，我可以没有到达[0]存储2个不同的值。
它不能存储0和字符串a，像这样从字面上取代
什么是在$ ARR [0]以前。
我之所以提起这件事时，它会看看会发生什么。
看到这里，我得到了0打印出来，然后在这里。
有没有新的生产线，因为我是个懒人，并没有把它英寸
什么是酷的是，我们可以用这样的一种方式
捕捉到了这个念头一组
我们不能在一个阵列中有多个密钥。
我们不能有相同的键，在一个阵列。
我不能让键0和值1和0键和值一
或0键和值true。
这些键都只有1数组中的键。
即使你可以有相同的值存储
阵列中的不同的密钥下多次
在你的PHP数组具有相同的键多次，这是不可能的。
>> 如果我们看一下在这个未来的问题，unique.php，
我们要打开一个PHP文件
包含一个字符串列表，每行一个字符串，
我们要在该文件中找到的唯一的字符串
我们要做的是使用这些PHP数组
和在文件中使用的字符串到这个数组中的键
并不断更新我们的数组，因为我们这些新的密钥存储。
当我们读出来的文件的每一行，我们可以将其存储在数组中，
并在年底，我们将有我们的钥匙在我们的数组
所有在文件中唯一的字符串。
这是否有意义吗？
让我们来看看它是如何工作的。
我们去开拓，根据该规范，创建一个新文件unique.php。
打开。哎呀，对不起，新的文件。
我们要开始了相同的开始和结束标记。
我们将它保存在第9，和我们要调用它unique.php的。
好了，现在放大。
这里的想法是打开一个文件，
读取文件中的行由行。
对于文件中的每一行
我们将有一个数组，其中有
作为我们的主要线路。
然后，当我们到这里就结束了
$改编的键是独特的线条
从文件，因为我们知道，如果我把这个数组的行
多次将只保留覆盖旧值，
，我们实际上可以把阵列产品线，本身只是喜欢。
>> 这是一种奇怪的。
我们相同的键值对存储一遍又一遍，一遍，
但是因为我们保证将只有1键称为行
因此，如果我们有一个文件说，动物的声音的文件，汪，汪，
喵，喵，哞，哞，每一次我们读的动物噪声在
像纬，将其存储在数组中，我们得到纬，然后第二次
我们存储纬它会覆盖第一次，我们把它保存。
最后，我们将只有一个数组中的条目
在我们的动物的声音文件中的每个动物的声音。
你们是否有信心，你可以解决的开幕PHP中的文件吗？
做到这一点的方法之一，让我们在这个快速的一种方式做到这一点
是用fopen，就像我们在前面看到的。
您可以的FOPEN some_file.txt。
你可以打开阅读模式，就像在C
这是一个非常好的办法做到这一点。
您还可以读取文件中的行由行
有相同的功能，他们中的很多，你在C.
你有FGETS。
你有FEOF，虽然我们不喜欢使用，
因为，要记住，这不是伟大的C.
你可以做同样的方式，
但这里是一个非常酷的事情。
对不起，我不希望做文件，但有一个函数在PHP调用文件，
此功能在这里是冷静，因为它的全部内容读
您指定的文件，所以some_file.txt的，
到一个数组中读出的文件的全部内容
然后让你遍历它，这是非常漂亮的。
>> 如果我们走了，例如，我们的Web浏览器
我们来看看谷歌的PHP文件
在这里，你可以看到我们的说明书上说，文件读取整个文件到一个数组，
我们可以file_get_contents返回一个文件的内容作为一个字符串，
但通常只是作为一个数组是非常好的，因为它做什么
它打破它，以便每个元素
在阵列中的文件是一行，
因此，如果我们看一下文件0，这是该文件的第一行。
文件1，第二行，文件2，第三行，等等，等等。
那岂不是很好，如果这是你必须做在C？
相当漂亮的。
大卫表明这在演讲中，他表现出的成语是
在除了环PHP我们的标准，我们有这样的
（$ I = 0; I <10; i + +），
，你可以做到这一点在PHP中，同样的事情也
我们也有这个很酷的结构，名为foreach的。
foreach是非常方便的遍历数组或数据结构时，
因为它可以让你拉出来的每个元素的数组
而无需手动做自己的索引，
而不必手动创建一个索引变量，增加它，
拉出值在数组中的这一点，因为这是一个非常普遍的事情。
>> 您可能已经这样做的时候，你在做C语言的吨
在这学期，所以这个foreach
我们可以在这个文件数组循环，
和语法的是，我们想现在这一大堆的循环
并指定该变量，我们将用它来存储
本地这个阵列的元素，这个foreach循环的范围的局部，
我们把它称为线。
如果它是一个文件，只是有一个字行
我们可以把它称为字为好，其实只是你给这个名称，
无论你怎么称呼它，
内循环，然后，你可以做任何你想做的这个变线。
如果没有足够的值的数组，你也希望得到
随着它的索引，你可以指定名称的索引
以及价值，现在你有2个变量的访问。
你有$ i和行
其中，$ i是索引数组中，
线是从文件中检索的行。
例如，如果我们想打印出来的文件，因为这回声线0，
就这样，我们能做到这一点，“行我的文件$行”
这里是我们也没有见过的东西
我只是完全跳过了整个％S％D业务
我们不得不处理在C，相反，我已经走了直
写在我的字符串中的变量线。
>> 这就是所谓的变量插值，串插
您在何处馅的变量，和PHP解释器
是足够聪明，当它通过一个字符串，用双引号开始阅读
而不是单引号，单引号字符串，你不能做到这一点，
但与双引号字符串，因为它读取的变量，通过它的。
它的狩猎下来，如果它认为变量将变量的值
并把它的字符串，如果它可以将其转换成一个字符串表示，
这是非常漂亮的。
现在，让我们注释掉其余的一切，
保存这一点，我们现在可以做的是，我们可以打开一个文件
我们可以称之为some_file.txt让我们创建一个新的文件
我们可以把一堆废话的东西，在这里只是为了测试所有的东西，
保存它，把它some_file.txt，我做在顶部，
现在，如果我缩小只是为了确保一切都在同一个目录
它看起来像我有unique.php some_file.txt在同一个目录。
如果我运行PHP unique.php的
如何打印我的文件中的每一行和该行是什么呢？
>> 这是非常强大的，对不对？
瞧，这花了3行代码就可以打开一个文件。
好了，4行代码。我不能指望今天，清楚。
但真的只有2有趣的代码行，因为其他的花括号，
但在这么多的代码中，我们可以打开一个文件，遍历它，
拉出来的行号和该行本身
并打印出来。
很酷的东西。夏洛特。
[夏洛特]我有一个问题关于语法。
所以你打开的文件的每一行的foreach处理，
然后当你想要做的事情的每一行，你只是做它作为
然后关联的值。
[内特H.]你可以做什么在这里的问题是
在fo​​reach做的阵列，所以foreach语法
真的是foreach和通知，有没有空间
之间的和每一个或任何东西。
他们去旁边对方，
然后它在一个数组中，
然后你有这被称为是有其他的关键字，
，然后后，作为你可以把一个变量名，
在这种情况下，你会被拉出数组元素的值，
不是索引，或者如果你这样做，因为我们已经写在下面
你得到的键和值。
您有forEach元素的数组或对数组的键价值
或为正义价值。
根据你所需要的，如果你不需要的钥匙，
那么你可以去的值。
如果你想要的键，你可以和他们一起去了。
>> [夏洛特]我也意识到，我们从未宣布过我或线。
它是如何知道它们是什么？
内特H.]你是什么意思的声明？
[夏洛特]我们从来没有告诉他们我还是行的手段。
[内特H.]我们从来没有告诉计算机什么，我行表示在
[夏洛特，他们是索引，当当
[内特H.]我们从来没有告诉它，这是应该的索引或键和值，
这是因为这是PHP解释器。
作为声明说，没关系，关键是要
一个变量叫我存储在一个名为i的变量。
该值将被存储在一个变量称为线
所以作为这些变量的声明
说$我是一个关键，$线的值。
是啊，艾拉。
[云裳]如果没有这样做的关键数字
它是如何决定什么样的顺序要打印的一切吗？
这是不是就是它被输入的顺序吗？
[内特H.]让我们给它一个尝试。
让我们创建一个变量称为改编，
我们可以做一个“7。
比方说，0到另一个阵列，1，2，或苹果。
比方说，7变为1，B 2，
和3〜4。
这是一个疯狂的寻找例子，因为我们是混合
字符串和整数的地方。
这个数组有没有真正的订单。
我的意思是，我们可以责令一切都在按字母顺序排列的键。
我们可以责令一切按字母顺序排列的值。
>> 我们可以尝试，并考虑到有些字符串，有些是整数，
，我们可以尝试将它们转换为相同的类型，看看会发生什么，
或者我们可以认为他们的价值，我们已经进入他们
我们把这个家伙在第一，第二，这家伙这家伙在第三，
这家伙在第四位，等等。
让我们来看看运行此代码时会发生什么。
如果我们向下滚动，并做了同样的事情，
这里没有打印出新的生产线。
当它读出来的文件，它的价值观，包括新的生产线，
这就是为什么它打印出来很好，而这里没有，
所以这就是为什么的一切都smushed一起。
让我们添加新的行只是为了让这件事情。
让我们重新运行它，所以在这里
看看发生了什么事。
打印中，我们把它放入数组中的顺序。
它保持秩序，在这个意义上。
>> 让我们回到这个问题的唯一
我们希望能够遍历一个文件，
我们会给它some_file.txt，
我们要遍历这样的。
我们说，我们要使用一个数组，以确保我们得到了所有的
独特的线，我们能做到这一点真的很容易
仅通过存储在一个数组，我们当然声明一个循环的范围之外，
和我们说，如果我们使用的是文件中的行的钥匙在我们的数组
如果我们输入了重复的行，我们会覆盖掉原来的值。
这是以往任何时候都可能有2个按键在同一阵列中是相同的。
我们可以做到这一点。
我们可以摆脱这个echo语句就在这里。
在这里，我们文件中的行存储在数组中
使用的关键。
没有它，事实证明，我们并不需要这个关键。
我们不需要变量i。
在这一点上，如果我们做的另一个foreach循环
我们循环在每个改编
和线路，如果现在我们ECHO-哎呀，对不起。
我们不能用逗号。我们必须使用此关键字。
现在，如果我们回声线，我们应该得到所有在该文件中的唯一的话。
如果我们去了到some_file.txt，
让我们说，我们做的苹果，香蕉，苹果，苹果，香蕉，
如果我们打印出所有的独特的话，在这个文件中，我们应该只得到
苹果和香蕉打印出来。
如果我们现在在这里，我们将放大，
PHP unique.php，和ta-DA。
我们已经成功地uniqued的文件。
>> 这个问题的最后一部分是问你这个数组进行排序，然后再打印出来
因为在这个简单的例子中，我们刚刚做
在这个意义上，我们很幸运的文件
我们这样做是人为的例子，苹果和香蕉。
它已经排序。
但是，使用简单的排序功能，您可以排序的数组，这是相当漂亮的。
最后一点我想谈谈你们真的很快
是这样的PHP是一切都很好，这是超级方便
知道该怎么办，如果你需要编程做小，见效快的事情。
例如，如果我需要写一个程序，说，
使大家我不打算去，并把它写在C段
这将是长期的。
这将是一种痛苦，特别是如果有涉及的文件，
正如你们所看到的。
它是如此漂亮，只是这么多的代码，在这里
我们能够通过的文件中抓取音轨，使出浑身的独特价值
和打印他们退了出去。
>> 然而，对于分配给你的，你的项目，
如果你建立的网站，PHP的力量是
我们正在运行的PHP文件，通过这个解释，
解释器处理的PHP标签内的所有内容，
一切原封未动，吐出的结果。
建立HTML编程方式，我们可以做到这一点。
现在，如果我们回去的规范，最后一个问题，在规范中
谈到这个想法的浓度
并创建一个下拉菜单，
您可能会或可能不希望这样做，这取决于您的最终项目正在做什么，
，它允许用户选择从一个列表中的所有可能的浓度
他们的浓度。
现在，这是一种痛苦的键入此
做这一切手动，特别是当你以确保
你有所有的尖括号在正确的地方，所有的报价在正确的地方，
与PHP中，你可以做到这一点编程，你可以做到这一点真的很快。
>> 让我们来看看如何做到这一点。
我们要去打开一个新的文件。
我们打​​算把我们的PHP标签。
我们将把它称为concentrations.php，
，现在当你这样做的一件好事种思考
当你想你的PHP和HTML混合和匹配
搞清楚，什么是好了，我想以编程方式生成的部分吗？
的一部分，我可以通过编程生成是什么？
这是真的，你可以做你的HTML
里面的PHP块。
您可以重复所有的HTML作为字符串。
例如，如果我要开始做选择的PHP标签里面
我能说的回声，说选择名字浓度，
然后向下跌破，我可以有另一种回声标签
或其他回声称为近的选择。
这是一个办法做到这一点，因为这是真正的做
打印出该字符串通过PHP解释器时，它的运行，
这样的结果将是HTML。
如果我保存这个文件，因为它是现在
和运行PHP concentrations.php的
看看我得到了什么。
我得到这个开放的关闭选择标签。
>> 如果我要做到这一点，我是这样的结果保存到一个文件中，
说，等待concentrations.html，它看起来像已经到另一侧的L-
现在，如果我在这里开了concentrations.html你看，我有一个有效的HTML文件。
那是一种奇怪的呢？
我们正在使用PHP创建HTML，创建有效的HTML。
我们正在做的是，我们的PHP打印
我们希望它打印的HTML。
这简直是​​PHP网站如何工作的。
当你访问一个网站，把你喜欢的东西
什么，什么，什么点com斜线的index.php
该计算机是真正的调用index.php文件，
执行它通过PHP解释器，以及任何垃圾出来
它发回给浏览器，说哎，浏览器，将此解释为HTML。
这种做法的好处是，它可以是一个痛苦的不断谱写回声，回声，回声，回声
在这样的引号括一切，所以如果你想要写
HTML，将是静态的，你可以像这样做，
把它放到外面，关闭它，
然后在这里你只把里面的PHP标签，你知道
你想以编程方式生成，在这种情况下，这些选项标签
是一个痛苦的产生。
>> 例如，我们可以产生一千个选项标签
做这样的事情，我<1000，+ +
说echo参数值= $哎呦，我不能这样做。
好了，让我们给它一个尝试，看看会发生什么。
$ i，然后说我</选项。
而不是输入该选项标签，一千个不同的时代
我使用的PHP代码，它会自动生成，通过编程。
一种漂亮。是啊。
我记得这个被提到的讲座或演练，
但在双引号之间的区别是什么，
正常的，这些单一的东西吗？
这是实际的东西，我已经做了不正确的，在这里，我要告诉你。
单引号不允许任何特殊字符，
所以一切都在一个单引号的字符串是字面上的解释。
如果我有一个\ n里面的单引号和保存，例如，
现在我走在这里，运行
哎呀，我要去哪里？
哦，那是因为我忘了$。
>> 现在，如果我打开了，其实，在这里，我们将摆脱的输入到一个文件中。
我们只需要读它。
在这里，你看，我有这个文字\ n字符串中的一样，而不是实际的新的生产线，
同样地，而不是实际内插这个变量的值
它给了我我本身，这是一种痛苦。
解决这个问题的方法是使用双引号，
然后当你使用双引号，它实际上会
正确插值所有这些变量的值，在这里
也认识到这一点的\ n是新的生产线，这是
\ n。
使用单一的很好，当你有
因为可能被解释为特殊字符的字符，那么你不有
他们不断地逃避。
事情可以变得凌乱，通常我做的方式，
只是为了让事情变得简单，就是如果我有什么
HTML喜欢在我的代码，我会包括编辑单引号内
然后使用这个连接操作符
要连接的变量中。
这是这样做的另一种方式
我们已经有了要连接的点，这是一个字符串
与此与此与此，
现在我没有逃避这些双引号。
我没有使用这个家伙逃脱。
他们会从字面上可以打印出来作为双引号括起来，然后这家伙就在这里。
这是另一种方式混合起来。
>> [学生]：另外，当你呼应的getType有没有引号。
对，所以回声是一种特殊的，在这个意义上，你不需要括号。
您不需要有一定的引号周围的变量，
说回声$我喜欢它的有效，它要解释这是一个字符串。
做演员，这是怎么回事，所以我们可以这样做，而且是有效的，但我们并不需要它。
它是可选的。
在本周的问题集中寻找出了很多这样的东西
你混合并匹配HTML与PHP
就这样，现在如果我们向后滚动，我们运行这个
我们可以看到，我们有一大堆的选项值
刚打印出来。
我们有这一切都得到了生成的HTML，我们真的很快。
我会离开它作为一个练习。
这是非常类似的文件阅读我们先前做的。
>> 是一个concentrations.txt的文件，你可以拉下来的CDN，
你可以打开它的foreach使用相同的伎俩，我们先前做的，
和foreach，你只需要呼应的选项和插件
适当的值，相应的键和索引，
然后你就滴下来，从字面上创建
编程的你在哈佛的不同浓度。
有一个方便的事情。
这个任务有很多配置的东西。
如果你没有这样做，它已经采取接下来的半小时，一小时，
一段时间今晚肯定是肯定的，
穿行问题集规格，
看看是怎么回事设立的虚拟主机，本地主机，所有的东西。
有一点需要指出的是，
在大多数问题集，我们已经进入你的Dropbox文件夹
的问题设定的zip文件，然后下载并解压缩。
对于这个问题集，你不想。
你想进入这个虚拟主机目录。
您将要进入的虚拟主机，并进入本地主机目录内，
这是你要拉下来的zip文件，
解压缩，然后准备好去。
你必须遵循的步骤密切。
>> 如果您有任何疑问，请发送电子邮件，将它张贴在讨论，来办公时间。
谢谢你们。下周，我们将有一个审查会议测验。
享受你的最后一个问题集。我希望这一切都非常好。
[CS50.TV]