[php学习资料] PHP完全自学手册(文档教程)

[复制链接]
 楼主| 发表于 2019-11-19 12:15:19 | 显示全部楼层
PHP Switch 语句
switch 语句用于根据多个不同条件执行不同动作。

PHP Switch 语句
如果您希望有选择地执行若干代码块之一,请使用 switch 语句。
语法
  1. switch (n){case label1:
  2.         如果 n=label1,此处代码将执行;
  3.         break;case label2:
  4.         如果 n=label2,此处代码将执行;
  5.         break;default:
  6.         如果 n 既不等于 label1 也不等于 label2,此处代码将执行;}
复制代码

工作原理:首先对一个简单的表达式 n(通常是变量)进行一次计算。将表达式的值与结构中每个 case 的值进行比较。如果存在匹配,则执行与 case 关联的代码。代码执行后,使用 break 来阻止代码跳入下一个 case 中继续执行。default 语句用于不存在匹配(即没有 case 为真)时执行。
实例
  1. <?php
  2. $favcolor="red";
  3. switch ($favcolor)
  4. {
  5. case "red":
  6.     echo "你喜欢的颜色是红色!";
  7.     break;
  8. case "blue":
  9.     echo "你喜欢的颜色是蓝色!";
  10.     break;
  11. case "green":
  12.     echo "你喜欢的颜色是绿色!";
  13.     break;
  14. default:
  15.     echo "你喜欢的颜色不是 红, 蓝, 或绿色!";
  16. }
  17. ?>
复制代码


运行结果:
  1. 你喜欢的颜色是红色!
复制代码



腾讯云
回复

使用道具 举报

 楼主| 发表于 2019-11-19 12:19:20 | 显示全部楼层
PHP 数组
数组能够在单个变量中存储多个值:
实例
  1. <?php
  2. $cars=array("Volvo","BMW","Toyota");
  3. echo "I like " . $cars[0] . ", " . $cars[1] . " and " . $cars[2] . ".";
  4. ?>
复制代码


运行结果:

  1. I like Volvo, BMW and Toyota.
复制代码



数组是什么?
数组是一个能在单个变量中存储多个值的特殊变量。
如果您有一个项目清单(例如:车名字的清单),将其存储到单个变量中,如下所示:
  1. $cars1="Volvo";
  2. $cars2="BMW";
  3. $cars3="Toyota";
复制代码

然而,如果您想要遍历数组并找出特定的一个呢?如果数组的项不只 3 个而是 300 个呢?
解决办法是创建一个数组!
数组可以在单个变量中存储多个值,并且您可以根据键访问其中的值。

在 PHP 中创建数组
在 PHP 中,array() 函数用于创建数组:
array();
在 PHP 中,有三种类型的数组:
  • 数值数组 - 带有数字 ID 键的数组
  • 关联数组 - 带有指定的键的数组,每个键关联一个值
  • 多维数组 - 包含一个或多个数组的数组


PHP 数值数组
这里有两种创建数值数组的方法:
自动分配 ID 键(ID 键总是从 0 开始):
$cars=array("Volvo","BMW","Toyota");
人工分配 ID 键:
$cars[0]="Volvo";
$cars[1]="BMW";
$cars[2]="Toyota";
下面的实例创建一个名为 $cars 的数值数组,并给数组分配三个元素,然后打印一段包含数组值的文本:
实例
  1. <?php
  2. $cars=array("Volvo","BMW","Toyota");
  3. echo "I like " . $cars[0] . ", " . $cars[1] . " and " . $cars[2] . ".";
  4. ?>
复制代码


运行结果:

  1. I like Volvo, BMW and Toyota.
复制代码




获取数组的长度 - count() 函数
count() 函数用于返回数组的长度(元素的数量):
实例
  1. <?php
  2. $cars=array("Volvo","BMW","Toyota");
  3. echo count($cars);
  4. ?>
复制代码


运行结果:
  1. 3
复制代码





遍历数值数组
遍历并打印数值数组中的所有值,您可以使用 for 循环,如下所示:
实例
  1. <?php
  2. $cars=array("Volvo","BMW","Toyota");
  3. $arrlength=count($cars);
  4. for($x=0;$x<$arrlength;$x++)
  5. {
  6. echo $cars[$x];
  7. echo "<br>";
  8. }
  9. ?>
复制代码


运行结果:
  1. Volvo
  2. BMW
  3. Toyota
复制代码






PHP 关联数组
关联数组是使用您分配给数组的指定的键的数组。
这里有两种创建关联数组的方法:
$age=array("Peter"=>"35","Ben"=>"37","Joe"=>"43");
or:
$age['Peter']="35";
$age['Ben']="37";
$age['Joe']="43";
随后可以在脚本中使用指定的键:
实例
  1. <?php
  2. $age=array("Peter"=>"35","Ben"=>"37","Joe"=>"43");
  3. echo "Peter is " . $age['Peter'] . " years old.";
  4. ?>
复制代码


运行结果:
  1. Peter is 35 years old.
复制代码





遍历关联数组
遍历并打印关联数组中的所有值,您可以使用 foreach 循环,如下所示:
实例
  1. <?php
  2. $age=array("Peter"=>"35","Ben"=>"37","Joe"=>"43");
  3. foreach($age as $x=>$x_value)
  4. {
  5. echo "Key=" . $x . ", Value=" . $x_value;
  6. echo "<br>";
  7. }
  8. ?>
复制代码


运行结果:
  1. Key=Peter, Value=35
  2. Key=Ben, Value=37
  3. Key=Joe, Value=43
复制代码




多维数组
多维数组 将在 PHP 高级教程部分做详细介绍。

回复

使用道具 举报

 楼主| 发表于 2019-11-19 12:22:22 | 显示全部楼层
PHP 数组排序
数组中的元素可以按字母或数字顺序进行降序或升序排列。

PHP - 数组排序函数
在本章中,我们将一一介绍下列 PHP 数组排序函数:
  • sort() - 对数组进行升序排列
  • rsort() - 对数组进行降序排列
  • asort() - 根据关联数组的值,对数组进行升序排列
  • ksort() - 根据关联数组的键,对数组进行升序排列
  • arsort() - 根据关联数组的值,对数组进行降序排列
  • krsort() - 根据关联数组的键,对数组进行降序排列


sort() - 对数组进行升序排列
下面的实例将 $cars 数组中的元素按照字母升序排列:
实例
  1. <?php
  2. $cars=array("Volvo","BMW","Toyota");
  3. sort($cars);
  4. ?>
复制代码


运行结果:
  1. Array
  2. (
  3.     [0] => BMW
  4.     [1] => Toyota
  5.     [2] => Volvo
  6. )
复制代码


下面的实例将 $numbers 数组中的元素按照数字升序排列:
实例
  1. <?php
  2. $numbers=array(4,6,2,22,11);
  3. sort($numbers);
  4. ?>
复制代码


运行结果:
  1. Array
  2. (
  3.     [0] => 2
  4.     [1] => 4
  5.     [2] => 6
  6.     [3] => 11
  7.     [4] => 22
  8. )
复制代码



rsort() - 对数组进行降序排列
下面的实例将 $cars 数组中的元素按照字母降序排列:
实例
  1. <?php
  2. $cars=array("Volvo","BMW","Toyota");
  3. rsort($cars);
  4. ?>
复制代码


运行结果:
  1. Array
  2. (
  3.     [0] => Volvo
  4.     [1] => Toyota
  5.     [2] => BMW
  6. )
复制代码


下面的实例将 $numbers 数组中的元素按照数字降序排列:
实例
  1. <?php
  2. $numbers=array(4,6,2,22,11);
  3. rsort($numbers);
  4. ?>
复制代码


运行结果:
  1. Array
  2. (
  3.     [0] => 22
  4.     [1] => 11
  5.     [2] => 6
  6.     [3] => 4
  7.     [4] => 2
  8. )
复制代码



asort() - 根据数组的值,对数组进行升序排列
下面的实例根据数组的值,对关联数组进行升序排列:
实例
  1. <?php
  2. $age=array("Peter"=>"35","Ben"=>"37","Joe"=>"43");
  3. asort($age);
  4. ?>
复制代码


运行结果:
  1. Array
  2. (
  3.     [Peter] => 35
  4.     [Ben] => 37
  5.     [Joe] => 43
  6. )
复制代码



ksort() - 根据数组的键,对数组进行升序排列
下面的实例根据数组的键,对关联数组进行升序排列:
实例
  1. <?php
  2. $age=array("Peter"=>"35","Ben"=>"37","Joe"=>"43");
  3. ksort($age);
  4. ?>
复制代码


运行结果:
  1. Array
  2. (
  3.     [Ben] => 37
  4.     [Joe] => 43
  5.     [Peter] => 35
  6. )
复制代码



arsort() - 根据数组的值,对数组进行降序排列
下面的实例根据数组的值,对关联数组进行降序排列:
实例
  1. <?php
  2. $age=array("Peter"=>"35","Ben"=>"37","Joe"=>"43");
  3. arsort($age);
  4. ?>
复制代码


运行结果:
  1. Array
  2. (
  3.     [Joe] => 43
  4.     [Ben] => 37
  5.     [Peter] => 35
  6. )
复制代码



krsort() - 根据数组的键,对数组进行降序排列
下面的实例根据数组的键,对关联数组进行降序排列:
实例
  1. <?php
  2. $age=array("Peter"=>"35","Ben"=>"37","Joe"=>"43");
  3. krsort($age);
  4. ?>
复制代码


运行结果:
  1. Array
  2. (
  3.     [Peter] => 35
  4.     [Joe] => 43
  5.     [Ben] => 37
  6. )
复制代码



回复

使用道具 举报

 楼主| 发表于 2019-11-19 12:24:19 | 显示全部楼层
PHP 超级全局变量
超级全局变量在PHP 4.1.0之后被启用, 是PHP系统中自带的变量,在一个脚本的全部作用域中都可用。

PHP 超级全局变量
PHP中预定义了几个超级全局变量(superglobals) ,这意味着它们在一个脚本的全部作用域中都可用。 你不需要特别说明,就可以在函数及类中使用。
PHP 超级全局变量列表:
  • $GLOBALS
  • $_SERVER
  • $_REQUEST
  • $_POST
  • $_GET
  • $_FILES
  • $_ENV
  • $_COOKIE
  • $_SESSION

本章节我们将讲解几个常用的超级全局变量,其余变量我们在接下来几个章节会介绍到。

PHP $GLOBALS
$GLOBALS 是PHP的一个超级全局变量组,在一个PHP脚本的全部作用域中都可以访问。
$GLOBALS 是一个包含了全部变量的全局组合数组。变量的名字就是数组的键。
以下实例介绍了如何使用超级全局变量 $GLOBALS:
实例
  1. <?php
  2. $x = 75;
  3. $y = 25;

  4. function addition()
  5. {
  6. $GLOBALS['z'] = $GLOBALS['x'] + $GLOBALS['y'];
  7. }

  8. addition();
  9. echo $z;
  10. ?>
复制代码


运行结果:
100

以上实例中 z 是一个$GLOBALS数组中的超级全局变量,该变量同样可以在函数外访问。

PHP $_SERVER
$_SERVER 是一个包含了诸如头信息(header)、路径(path)、以及脚本位置(script locations)等等信息的数组。这个数组中的项目由 Web 服务器创建。不能保证每个服务器都提供全部项目;服务器可能会忽略一些,或者提供一些没有在这里列举出来的项目。
以下实例中展示了如何使用$_SERVER中的元素:
实例
  1. <?php
  2. echo $_SERVER['PHP_SELF'];
  3. echo "<br>";
  4. echo $_SERVER['SERVER_NAME'];
  5. echo "<br>";
  6. echo $_SERVER['HTTP_HOST'];
  7. echo "<br>";
  8. echo $_SERVER['HTTP_REFERER'];
  9. echo "<br>";
  10. echo $_SERVER['HTTP_USER_AGENT'];
  11. echo "<br>";
  12. echo $_SERVER['SCRIPT_NAME'];
  13. ?>
复制代码


运行结果:
  1. /try/demo_source/demo_global_server.php
  2. www.runoob.com
  3. www.runoob.com
  4. http://www.runoob.com/try/showphp.php?filename=demo_global_server
  5. Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko)
  6. Chrome/56.0.2924.87 Safari/537.36
  7. /try/demo_source/demo_global_server.php
复制代码


下表列出了所有 $_SERVER 变量中的重要元素:
元素/代码
描述
$_SERVER['PHP_SELF']当前执行脚本的文件名,与 document root 有关。例如,在地址为 http://example.com/test.php/foo.bar 的脚本中使用 $_SERVER['PHP_SELF'] 将得到 /test.php/foo.bar。__FILE__ 常量包含当前(例如包含)文件的完整路径和文件名。 从 PHP 4.3.0 版本开始,如果 PHP 以命令行模式运行,这个变量将包含脚本名。之前的版本该变量不可用。
$_SERVER['GATEWAY_INTERFACE']服务器使用的 CGI 规范的版本;例如,"CGI/1.1"。
$_SERVER['SERVER_ADDR']当前运行脚本所在的服务器的 IP 地址。
$_SERVER['SERVER_NAME']当前运行脚本所在的服务器的主机名。如果脚本运行于虚拟主机中,该名称是由那个虚拟主机所设置的值决定。(如: www.runoob.com)
$_SERVER['SERVER_SOFTWARE']服务器标识字符串,在响应请求时的头信息中给出。 (如:Apache/2.2.24)
$_SERVER['SERVER_PROTOCOL']请求页面时通信协议的名称和版本。例如,"HTTP/1.0"。
$_SERVER['REQUEST_METHOD']访问页面使用的请求方法;例如,"GET", "HEAD","POST","PUT"。
$_SERVER['REQUEST_TIME']请求开始时的时间戳。从 PHP 5.1.0 起可用。 (如:1377687496)
$_SERVER['QUERY_STRING']query string(查询字符串),如果有的话,通过它进行页面访问。
$_SERVER['HTTP_ACCEPT']当前请求头中 Accept: 项的内容,如果存在的话。
$_SERVER['HTTP_ACCEPT_CHARSET']当前请求头中 Accept-Charset: 项的内容,如果存在的话。例如:"iso-8859-1,*,utf-8"。
$_SERVER['HTTP_HOST']当前请求头中 Host: 项的内容,如果存在的话。
$_SERVER['HTTP_REFERER']引导用户代理到当前页的前一页的地址(如果存在)。由 user agent 设置决定。并不是所有的用户代理都会设置该项,有的还提供了修改 HTTP_REFERER 的功能。简言之,该值并不可信。)
$_SERVER['HTTPS']如果脚本是通过 HTTPS 协议被访问,则被设为一个非空的值。
$_SERVER['REMOTE_ADDR']浏览当前页面的用户的 IP 地址。
$_SERVER['REMOTE_HOST']浏览当前页面的用户的主机名。DNS 反向解析不依赖于用户的 REMOTE_ADDR。
$_SERVER['REMOTE_PORT']用户机器上连接到 Web 服务器所使用的端口号。
$_SERVER['SCRIPT_FILENAME']当前执行脚本的绝对路径。
$_SERVER['SERVER_ADMIN']该值指明了 Apache 服务器配置文件中的 SERVER_ADMIN 参数。如果脚本运行在一个虚拟主机上,则该值是那个虚拟主机的值。(如:someone@runoob.com)
$_SERVER['SERVER_PORT']Web 服务器使用的端口。默认值为 "80"。如果使用 SSL 安全连接,则这个值为用户设置的 HTTP 端口。
$_SERVER['SERVER_SIGNATURE']包含了服务器版本和虚拟主机名的字符串。
$_SERVER['PATH_TRANSLATED']当前脚本所在文件系统(非文档根目录)的基本路径。这是在服务器进行虚拟到真实路径的映像后的结果。
$_SERVER['SCRIPT_NAME']包含当前脚本的路径。这在页面需要指向自己时非常有用。__FILE__ 常量包含当前脚本(例如包含文件)的完整路径和文件名。
$_SERVER['SCRIPT_URI']URI 用来指定要访问的页面。例如 "/index.html"。


PHP $_REQUEST
PHP $_REQUEST 用于收集HTML表单提交的数据。
以下实例显示了一个输入字段(input)及提交按钮(submit)的表单(form)。 当用户通过点击 "Submit" 按钮提交表单数据时, 表单数据将发送至<form>标签中 action 属性中指定的脚本文件。 在这个实例中,我们指定文件来处理表单数据。如果你希望其他的PHP文件来处理该数据,你可以修改该指定的脚本文件名。 然后,我们可以使用超级全局变量 $_REQUEST 来收集表单中的 input 字段数据:
实例
  1. <html>
  2. <body>
  3. <form method="post" action="<?php echo $_SERVER['PHP_SELF'];?>">
  4. Name: <input type="text" name="fname">
  5. <input type="submit">
  6. </form>
  7. <?php
  8. $name = $_REQUEST['fname'];
  9. echo $name;
  10. ?>
  11. </body>
  12. </html>
复制代码


运行结果:
Name:  


PHP $_POST
PHP $_POST 被广泛应用于收集表单数据,在HTML form标签的指定该属性:"method="post"。
以下实例显示了一个输入字段(input)及提交按钮(submit)的表单(form)。 当用户通过点击 "Submit" 按钮提交表单数据时, 表单数据将发送至<form>标签中 action 属性中指定的脚本文件。 在这个实例中,我们指定文件来处理表单数据。如果你希望其他的PHP文件来处理该数据,你可以修改该指定的脚本文件名。 然后,我们可以使用超级全局变量 $_POST 来收集表单中的 input 字段数据:
实例
  1. <html>
  2. <body>

  3. <form method="post" action="<?php echo $_SERVER['PHP_SELF'];?>">
  4. Name: <input type="text" name="fname">
  5. <input type="submit">
  6. </form>

  7. <?php
  8. $name = $_POST['fname'];
  9. echo $name;
  10. ?>

  11. </body>
  12. </html>
复制代码


运行结果:
Name:  



PHP $_GET
PHP $_GET 同样被广泛应用于收集表单数据,在HTML form标签的指定该属性:"method="get"。
$_GET 也可以收集URL中发送的数据。
假定我们有一个包含参数的超链接HTML页面:
  1. <html>
  2. <body>
  3. <a href="test_get.php?subject=PHP&web=runoob.com">Test $GET</a>
  4. </body>
  5. </html>
复制代码

当用户点击链接 "Test $GET", 参数 "subject" 和 "web" 将发送至"test_get.php",你可以在 "test_get.php" 文件中使用 $_GET 变量来获取这些数据。
以下实例显示了 "test_get.php" 文件的代码:
实例
  1. <html>
  2. <body>
  3. <?php
  4. echo "Study " . $_GET['subject'] . " at " . $_GET['web'];
  5. ?>
  6. </body>
  7. </html>
复制代码


运行结果:
测试 $_GET

回复

使用道具 举报

 楼主| 发表于 2019-11-19 15:19:32 | 显示全部楼层
PHP 循环 - While 循环
循环执行代码块指定的次数,或者当指定的条件为真时循环执行代码块。

PHP 循环
在您编写代码时,您经常需要让相同的代码块一次又一次地重复运行。我们可以在代码中使用循环语句来完成这个任务。
在 PHP 中,提供了下列循环语句:
  • while - 只要指定的条件成立,则循环执行代码块
  • do...while - 首先执行一次代码块,然后在指定的条件成立时重复这个循环
  • for - 循环执行代码块指定的次数
  • foreach - 根据数组中每个元素来循环代码块


while 循环
while 循环将重复执行代码块,直到指定的条件不成立。
语法
while (条件)
{
要执行的代码;
}
实例
下面的实例首先设置变量 i 的值为 1 ($i=1;)。
然后,只要 i 小于或者等于 5,while 循环将继续运行。循环每运行一次,i 就会递增 1:
  1. <html>
  2. <body>
  3. <?php
  4. $i=1;
  5. while($i<=5)
  6. {
  7. echo "The number is " . $i . "<br>";
  8. $i++;
  9. }
  10. ?>
  11. </body>
  12. </html>
复制代码

输出:
  1. The number is 1
  2. The number is 2
  3. The number is 3
  4. The number is 4
  5. The number is 5
复制代码



do...while 语句
do...while 语句会至少执行一次代码,然后检查条件,只要条件成立,就会重复进行循环。
语法
do
{
要执行的代码;
}
while (条件);
实例
下面的实例首先设置变量 i 的值为 1 ($i=1;)。
然后,开始 do...while 循环。循环将变量 i 的值递增 1,然后输出。先检查条件(i 小于或者等于 5),只要 i 小于或者等于 5,循环将继续运行:
  1. <html>
  2. <body>
  3. <?php
  4. $i=1;
  5. do
  6. {
  7. $i++;
  8. echo "The number is " . $i . "<br>";
  9. }
  10. while ($i<=5);
  11. ?>
  12. </body>
  13. </html>
复制代码

输出:
  1. The number is 2
  2. The number is 3
  3. The number is 4
  4. The number is 5
  5. The number is 6
复制代码

for 循环和 foreach 循环将在下一章进行讲解。

回复

使用道具 举报

 楼主| 发表于 2019-11-19 15:21:55 | 显示全部楼层
PHP 循环 - For 循环
循环执行代码块指定的次数,或者当指定的条件为真时循环执行代码块。

for 循环
for 循环用于您预先知道脚本需要运行的次数的情况。
语法
for (初始值; 条件; 增量)
{
要执行的代码;
}
参数:
  • 初始值:主要是初始化一个变量值,用于设置一个计数器(但可以是任何在循环的开始被执行一次的代码)。
  • 条件:循环执行的限制条件。如果为 TRUE,则循环继续。如果为 FALSE,则循环结束。
  • 增量:主要用于递增计数器(但可以是任何在循环的结束被执行的代码)。

注释:上面的初始值和增量参数可为空,或者有多个表达式(用逗号分隔)。
实例
下面的实例定义一个初始值为 i=1 的循环。只要变量 i 小于或者等于 5,循环将继续运行。循环每运行一次,变量 i 就会递增 1:
  1. <html>
  2. <body>
  3. <?php
  4. for ($i=1; $i<=5; $i++)
  5. {
  6. echo "The number is " . $i . "<br>";
  7. }
  8. ?>
  9. </body>
  10. </html>
复制代码

输出:
  1. The number is 1
  2. The number is 2
  3. The number is 3
  4. The number is 4
  5. The number is 5
复制代码



foreach 循环
foreach 循环用于遍历数组。
Syntax
foreach ($array as $value)
{
要执行代码;
}
每进行一次循环,当前数组元素的值就会被赋值给 $value 变量(数组指针会逐一地移动),在进行下一次循环时,您将看到数组中的下一个值。
实例
下面的实例演示了一个输出给定数组的值的循环:
  1. <html>
  2. <body>
  3. <?php
  4. $x=array("one","two","three");
  5. foreach ($x as $value)
  6. {
  7. echo $value . "<br>";
  8. }
  9. ?>
  10. </body>
  11. </html>
复制代码

输出:
  1. one
  2. two
  3. three
复制代码



回复

使用道具 举报

 楼主| 发表于 2019-11-19 15:24:51 | 显示全部楼层
PHP 函数
PHP 的真正威力源自于它的函数。
在 PHP 中,提供了超过 1000 个内建的函数。

PHP 内建函数
如需查看所有数组函数的完整参考手册和实例,请见 PHP 参考手册

PHP 函数
在本章中,我们将为您讲解如何创建自己的函数。
如要在页面加载时执行脚本,您可以把它放到函数里。
函数是通过调用函数来执行的。
你可以在页面的任何位置调用函数。

创建 PHP 函数
函数是通过调用函数来执行的。
语法
function functionName()
{
要执行的代码;
}
PHP 函数准则:
  • 函数的名称应该提示出它的功能
  • 函数名称以字母或下划线开头(不能以数字开头)

实例
一个简单的函数,在其被调用时能输出我的名称:
  1. <html>
  2. <body>
  3. <?php
  4. function writeName()
  5. {
  6. echo "Kai Jim Refsnes";
  7. }
  8. echo "My name is ";
  9. writeName();
  10. ?>
  11. </body>
  12. </html>
复制代码

输出:
  1. My name is Kai Jim Refsnes
复制代码


PHP 函数 - 添加参数
为了给函数添加更多的功能,我们可以添加参数。参数类似变量。
参数就在函数名称后面有一个括号内指定。
实例 1
下面的实例将输出不同的名字,但姓是相同的:
  1. <html>
  2. <body>
  3. <?php
  4. function writeName($fname)
  5. {
  6. echo $fname . " Refsnes.<br>";
  7. }
  8. echo "My name is ";
  9. writeName("Kai Jim");
  10. echo "My sister's name is ";
  11. writeName("Hege");
  12. echo "My brother's name is ";
  13. writeName("Stale");
  14. ?>
  15. </body>
  16. </html>
复制代码

输出:
  1. My name is Kai Jim Refsnes.
  2. My sister's name is Hege Refsnes.
  3. My brother's name is Stale Refsnes.
复制代码


实例 2
下面的函数有两个参数:
  1. <html>
  2. <body>
  3. <?php
  4. function writeName($fname,$punctuation)
  5. {
  6. echo $fname . " Refsnes" . $punctuation . "<br>";
  7. }
  8. echo "My name is ";
  9. writeName("Kai Jim",".");
  10. echo "My sister's name is ";
  11. writeName("Hege","!");
  12. echo "My brother's name is ";
  13. writeName("Ståle","?");
  14. ?>
  15. </body>
  16. </html>
复制代码

输出:
  1. My name is Kai Jim Refsnes.
  2. My sister's name is Hege Refsnes!
  3. My brother's name is Ståle Refsnes?
复制代码


PHP 函数 - 返回值
如需让函数返回一个值,请使用 return 语句。
实例
  1. <html>
  2. <body>
  3. <?php
  4. function add($x,$y)
  5. {
  6. $total=$x+$y;
  7. return $total;
  8. }
  9. echo "1 + 16 = " . add(1,16);
  10. ?>
  11. </body>
  12. </html>
复制代码

输出:
  1. 1 + 16 = 17
复制代码



回复

使用道具 举报

 楼主| 发表于 2019-11-19 15:40:16 | 显示全部楼层
PHP 魔术变量
PHP 向它运行的任何脚本提供了大量的预定义常量。
不过很多常量都是由不同的扩展库定义的,只有在加载了这些扩展库时才会出现,或者动态加载后,或者在编译时已经包括进去了。
有八个魔术常量它们的值随着它们在代码中的位置改变而改变。
例如 __LINE__ 的值就依赖于它在脚本中所处的行来决定。这些特殊的常量不区分大小写,如下:

__LINE__
文件中的当前行号。
实例
  1. <?phpecho '这是第 " '  . __LINE__ . ' " 行';?>
复制代码

以上实例输出结果为:
  1. 这是第 “ 2 ” 行
复制代码


__FILE__
文件的完整路径和文件名。如果用在被包含文件中,则返回被包含的文件名。
自 PHP 4.0.2 起,__FILE__ 总是包含一个绝对路径(如果是符号连接,则是解析后的绝对路径),而在此之前的版本有时会包含一个相对路径。
实例:
实例
  1. <?phpecho '该文件位于 " '  . __FILE__ . ' " ';?>
复制代码

以上实例输出结果为:
  1. 该文件位于 “ E:\wamp\www\test\index.php ”
复制代码


__DIR__
文件所在的目录。如果用在被包括文件中,则返回被包括的文件所在的目录。
它等价于 dirname(__FILE__)。除非是根目录,否则目录中名不包括末尾的斜杠。(PHP 5.3.0中新增)
实例
  1. <?phpecho '该文件位于 " '  . __DIR__ . ' " ';?>
复制代码

以上实例输出结果为:
  1. 该文件位于 “ E:\wamp\www\test ”
复制代码


__FUNCTION__
函数名称(PHP 4.3.0 新加)。自 PHP 5 起本常量返回该函数被定义时的名字(区分大小写)。在 PHP 4 中该值总是小写字母的。
实例
  1. <?phpfunction test() {
  2.     echo  '函数名为:' . __FUNCTION__ ;}test();?>
复制代码

以上实例输出结果为:
  1. 函数名为:test
复制代码


__CLASS__
类的名称(PHP 4.3.0 新加)。自 PHP 5 起本常量返回该类被定义时的名字(区分大小写)。
在 PHP 4 中该值总是小写字母的。类名包括其被声明的作用区域(例如 Foo\Bar)。注意自 PHP 5.4 起 __CLASS__ 对 trait 也起作用。当用在 trait 方法中时,__CLASS__ 是调用 trait 方法的类的名字。
实例
  1. <?phpclass test {
  2.     function _print() {
  3.         echo '类名为:'  . __CLASS__ . "<br>";        echo  '函数名为:' . __FUNCTION__ ;    }}$t = new test();$t->_print();?>
复制代码

以上实例输出结果为:
  1. 类名为:test函数名为:_print
复制代码


__TRAIT__
Trait 的名字(PHP 5.4.0 新加)。自 PHP 5.4.0 起,PHP 实现了代码复用的一个方法,称为 traits。
Trait 名包括其被声明的作用区域(例如 Foo\Bar)。
从基类继承的成员被插入的 SayWorld Trait 中的 MyHelloWorld 方法所覆盖。其行为 MyHelloWorld 类中定义的方法一致。优先顺序是当前类中的方法会覆盖 trait 方法,而 trait 方法又覆盖了基类中的方法。
实例
  1. <?phpclass Base {
  2.     public function sayHello() {
  3.         echo 'Hello ';    }}
  4. trait SayWorld {
  5.     public function sayHello() {
  6.         parent::sayHello();        echo 'World!';    }}
  7. class MyHelloWorld extends Base {
  8.     use SayWorld;}
  9. $o = new MyHelloWorld();$o->sayHello();?>
复制代码

以上例程会输出:
  1. Hello World!
复制代码


__METHOD__
类的方法名(PHP 5.0.0 新加)。返回该方法被定义时的名字(区分大小写)。
实例:
实例
  1. <?phpfunction test() {
  2.     echo  '函数名为:' . __METHOD__ ;}test();?>
复制代码

以上实例输出结果为:
  1. 函数名为:test
复制代码


__NAMESPACE__
当前命名空间的名称(区分大小写)。此常量是在编译时定义的(PHP 5.3.0 新增)。
实例:
实例
  1. <?phpnamespace MyProject;
  2. echo '命名空间为:"', __NAMESPACE__, '"'; // 输出 "MyProject"?>
复制代码

以上实例输出结果为:
  1. 命名空间为:"MyProject"
复制代码



回复

使用道具 举报

 楼主| 发表于 2019-11-19 15:44:59 | 显示全部楼层
PHP 命名空间(namespace)
PHP 命名空间(namespace)是在PHP 5.3中加入的,如果你学过C#和Java,那命名空间就不算什么新事物。 不过在PHP当中还是有着相当重要的意义。
PHP 命名空间可以解决以下两类问题:
  • 用户编写的代码与PHP内部的类/函数/常量或第三方类/函数/常量之间的名字冲突。
  • 为很长的标识符名称(通常是为了缓解第一类问题而定义的)创建一个别名(或简短)的名称,提高源代码的可读性。

定义命名空间
默认情况下,所有常量、类和函数名都放在全局空间下,就和PHP支持命名空间之前一样。
命名空间通过关键字namespace 来声明。如果一个文件中包含命名空间,它必须在其它所有代码之前声明命名空间。语法格式如下;
  1. < ?php  
  2. // 定义代码在 'MyProject' 命名空间中  
  3. namespace MyProject;  

  4. // ... 代码 ...
复制代码

你也可以在同一个文件中定义不同的命名空间代码,如:
  1. < ?php  
  2. namespace MyProject1;  
  3. // MyProject1 命名空间中的PHP代码  

  4. namespace MyProject2;  
  5. // MyProject2 命名空间中的PHP代码   

  6. // 另一种语法
  7. namespace MyProject3 {  
  8. // MyProject3 命名空间中的PHP代码   
  9. }  
  10. ?>
复制代码

在声明命名空间之前唯一合法的代码是用于定义源文件编码方式的 declare 语句。所有非 PHP 代码包括空白符都不能出现在命名空间的声明之前。
  1. <?php
  2. declare(encoding='UTF-8'); //定义多个命名空间和不包含在命名空间中的代码namespace MyProject {const CONNECT_OK = 1;class Connection { /* ... */ }function connect() { /* ... */  }}namespace { // 全局代码session_start();$a = MyProject\connect();echo MyProject\Connection::start();}?>
复制代码

以下代码会出现语法错误:
  1. <html><?phpnamespace MyProject; // 命名空间前出现了“<html>” 会致命错误 - 命名空间必须是程序脚本的第一条语句?>
复制代码


子命名空间
与目录和文件的关系很象,PHP 命名空间也允许指定层次化的命名空间的名称。因此,命名空间的名字可以使用分层次的方式定义:
  1. <?phpnamespace MyProject\Sub\Level;  //声明分层次的单个命名空间const CONNECT_OK = 1;class Connection { /* ... */ }function Connect() { /* ... */  }?>
复制代码

上面的例子创建了常量 MyProject\Sub\Level\CONNECT_OK,类 MyProject\Sub\Level\Connection 和函数 MyProject\Sub\Level\Connect。

命名空间使用
PHP 命名空间中的类名可以通过三种方式引用:
  • 非限定名称,或不包含前缀的类名称,例如 $a=new foo(); 或 foo::staticmethod();。如果当前命名空间是 currentnamespace,foo 将被解析为 currentnamespace\foo。如果使用 foo 的代码是全局的,不包含在任何命名空间中的代码,则 foo 会被解析为foo。 警告:如果命名空间中的函数或常量未定义,则该非限定的函数名称或常量名称会被解析为全局函数名称或常量名称。
  • 限定名称,或包含前缀的名称,例如 $a = new subnamespace\foo(); 或 subnamespace\foo::staticmethod();。如果当前的命名空间是 currentnamespace,则 foo 会被解析为 currentnamespace\subnamespace\foo。如果使用 foo 的代码是全局的,不包含在任何命名空间中的代码,foo 会被解析为subnamespace\foo。
  • 完全限定名称,或包含了全局前缀操作符的名称,例如, $a = new \currentnamespace\foo(); 或 \currentnamespace\foo::staticmethod();。在这种情况下,foo 总是被解析为代码中的文字名(literal name)currentnamespace\foo。

下面是一个使用这三种方式的实例:
file1.php 文件代码
  1. <?phpnamespace Foo\Bar\subnamespace; const FOO = 1;function foo() {}class foo{
  2.     static function staticmethod() {}}?>
复制代码

file2.php 文件代码
  1. <?phpnamespace Foo\Bar;include 'file1.php';const FOO = 2;function foo() {}class foo{
  2.     static function staticmethod() {}}/* 非限定名称 */foo(); // 解析为 Foo\Bar\foo resolves to function Foo\Bar\foofoo::staticmethod(); // 解析为类 Foo\Bar\foo的静态方法staticmethod。resolves to class Foo\Bar\foo, method staticmethodecho FOO; // resolves to constant Foo\Bar\FOO/* 限定名称 */subnamespace\foo(); // 解析为函数 Foo\Bar\subnamespace\foosubnamespace\foo::staticmethod(); // 解析为类 Foo\Bar\subnamespace\foo,
  3.                                   // 以及类的方法 staticmethodecho subnamespace\FOO; // 解析为常量 Foo\Bar\subnamespace\FOO
  4.                                   /* 完全限定名称 */\Foo\Bar\foo(); // 解析为函数 Foo\Bar\foo\Foo\Bar\foo::staticmethod(); // 解析为类 Foo\Bar\foo, 以及类的方法 staticmethodecho \Foo\Bar\FOO; // 解析为常量 Foo\Bar\FOO?>
复制代码

注意访问任意全局类、函数或常量,都可以使用完全限定名称,例如 \strlen() 或 \Exception 或 \INI_ALL。
在命名空间内部访问全局类、函数和常量:
  1. <?phpnamespace Foo;function strlen() {}const INI_ALL = 3;class Exception {}$a = \strlen('hi'); // 调用全局函数strlen$b = \INI_ALL; // 访问全局常量 INI_ALL$c = new \Exception('error'); // 实例化全局类 Exception?>
复制代码


命名空间和动态语言特征
PHP 命名空间的实现受到其语言自身的动态特征的影响。因此,如果要将下面的代码转换到命名空间中,动态访问元素。
example1.php 文件代码:
  1. <?phpclass classname{
  2.     function __construct()
  3.     {
  4.         echo __METHOD__,"\n";
  5.     }}function funcname(){
  6.     echo __FUNCTION__,"\n";}const constname = "global";$a = 'classname';$obj = new $a; // prints classname::__construct$b = 'funcname';$b(); // prints funcnameecho constant('constname'), "\n"; // prints global?>
复制代码

必须使用完全限定名称(包括命名空间前缀的类名称)。注意因为在动态的类名称、函数名称或常量名称中,限定名称和完全限定名称没有区别,因此其前导的反斜杠是不必要的。
动态访问命名空间的元素
  1. <?phpnamespace namespacename;class classname{
  2.     function __construct()
  3.     {
  4.         echo __METHOD__,"\n";
  5.     }}function funcname(){
  6.     echo __FUNCTION__,"\n";}const constname = "namespaced";include 'example1.php';$a = 'classname';$obj = new $a; // prints classname::__construct$b = 'funcname';$b(); // prints funcnameecho constant('constname'), "\n"; // prints global/* note that if using double quotes, "\\namespacename\\classname" must be used */$a = '\namespacename\classname';$obj = new $a; // prints namespacename\classname::__construct$a = 'namespacename\classname';$obj = new $a; // also prints namespacename\classname::__construct$b = 'namespacename\funcname';$b(); // prints namespacename\funcname$b = '\namespacename\funcname';$b(); // also prints namespacename\funcnameecho constant('\namespacename\constname'), "\n"; // prints namespacedecho constant('namespacename\constname'), "\n"; // also prints namespaced?>
复制代码


namespace关键字和__NAMESPACE__常量
PHP支持两种抽象的访问当前命名空间内部元素的方法,__NAMESPACE__ 魔术常量和namespace关键字。
常量__NAMESPACE__的值是包含当前命名空间名称的字符串。在全局的,不包括在任何命名空间中的代码,它包含一个空的字符串。
__NAMESPACE__ 示例, 在命名空间中的代码
  1. <?phpnamespace MyProject;echo '"', __NAMESPACE__, '"'; // 输出 "MyProject"?>
复制代码

__NAMESPACE__ 示例,全局代码
  1. <?php

  2. echo '"', __NAMESPACE__, '"'; // 输出 ""?>
复制代码

常量 __NAMESPACE__ 在动态创建名称时很有用,例如:
使用__NAMESPACE__动态创建名称
  1. <?phpnamespace MyProject;function get($classname){
  2.     $a = __NAMESPACE__ . '\\' . $classname;
  3.     return new $a;}?>
复制代码

关键字 namespace 可用来显式访问当前命名空间或子命名空间中的元素。它等价于类中的 self 操作符。
namespace操作符,命名空间中的代码
  1. <?phpnamespace MyProject;use blah\blah as mine; // see "Using namespaces: importing/aliasing"blah\mine(); // calls function blah\blah\mine()namespace\blah\mine(); // calls function MyProject\blah\mine()namespace\func(); // calls function MyProject\func()namespace\sub\func(); // calls function MyProject\sub\func()namespace\cname::method(); // calls static method "method" of class MyProject\cname$a = new namespace\sub\cname(); // instantiates object of class MyProject\sub\cname$b = namespace\CONSTANT; // assigns value of constant MyProject\CONSTANT to $b?>
复制代码

namespace操作符, 全局代码
  1. <?phpnamespace\func(); // calls function func()namespace\sub\func(); // calls function sub\func()namespace\cname::method(); // calls static method "method" of class cname$a = new namespace\sub\cname(); // instantiates object of class sub\cname$b = namespace\CONSTANT; // assigns value of constant CONSTANT to $b?>
复制代码


使用命名空间:别名/导入
PHP 命名空间支持 有两种使用别名或导入方式:为类名称使用别名,或为命名空间名称使用别名。注意PHP不支持导入函数或常量。
在PHP中,别名是通过操作符 use 来实现的. 下面是一个使用所有可能的三种导入方式的例子:
1、使用use操作符导入/使用别名
  1. <?phpnamespace foo;use My\Full\Classname as Another;// 下面的例子与 use My\Full\NSname as NSname 相同use My\Full\NSname;// 导入一个全局类use \ArrayObject;$obj = new namespace\Another; // 实例化 foo\Another 对象$obj = new Another; // 实例化 My\Full\Classname 对象NSname\subns\func(); // 调用函数 My\Full\NSname\subns\func$a = new ArrayObject(array(1)); // 实例化 ArrayObject 对象// 如果不使用 "use \ArrayObject" ,则实例化一个 foo\ArrayObject 对象?>
复制代码

2、 一行中包含多个use语句
  1. <?phpuse My\Full\Classname as Another, My\Full\NSname;$obj = new Another; // 实例化 My\Full\Classname 对象NSname\subns\func(); // 调用函数 My\Full\NSname\subns\func?>
复制代码

导入操作是在编译执行的,但动态的类名称、函数名称或常量名称则不是。
3、导入和动态名称
  1. <?phpuse My\Full\Classname as Another, My\Full\NSname;$obj = new Another; // 实例化一个 My\Full\Classname 对象$a = 'Another';$obj = new $a;      // 实际化一个 Another 对象?>
复制代码

另外,导入操作只影响非限定名称和限定名称。完全限定名称由于是确定的,故不受导入的影响。
4、导入和完全限定名称
  1. <?phpuse My\Full\Classname as Another, My\Full\NSname;$obj = new Another; // instantiates object of class My\Full\Classname$obj = new \Another; // instantiates object of class Another$obj = new Another\thing; // instantiates object of class My\Full\Classname\thing$obj = new \Another\thing; // instantiates object of class Another\thing?>
复制代码


使用命名空间:后备全局函数/常量
在一个命名空间中,当 PHP 遇到一个非限定的类、函数或常量名称时,它使用不同的优先策略来解析该名称。类名称总是解析到当前命名空间中的名称。因此在访问系统内部或不包含在命名空间中的类名称时,必须使用完全限定名称,例如:
1、在命名空间中访问全局类
  1. <?phpnamespace A\B\C;class Exception extends \Exception {}$a = new Exception('hi'); // $a 是类 A\B\C\Exception 的一个对象$b = new \Exception('hi'); // $b 是类 Exception 的一个对象$c = new ArrayObject; // 致命错误, 找不到 A\B\C\ArrayObject 类?>
复制代码

对于函数和常量来说,如果当前命名空间中不存在该函数或常量,PHP 会退而使用全局空间中的函数或常量。
2、 命名空间中后备的全局函数/常量
  1. <?phpnamespace A\B\C;const E_ERROR = 45;function strlen($str){
  2.     return \strlen($str) - 1;}echo E_ERROR, "\n"; // 输出 "45"echo INI_ALL, "\n"; // 输出 "7" - 使用全局常量 INI_ALLecho strlen('hi'), "\n"; // 输出 "1"if (is_array('hi')) { // 输出 "is not array"
  3.     echo "is array\n";} else {
  4.     echo "is not array\n";}?>
复制代码


全局空间
如果没有定义任何命名空间,所有的类与函数的定义都是在全局空间,与 PHP 引入命名空间概念前一样。在名称前加上前缀 \ 表示该名称是全局空间中的名称,即使该名称位于其它的命名空间中时也是如此。
使用全局空间说明
  1. <?phpnamespace A\B\C;/* 这个函数是 A\B\C\fopen */function fopen() {
  2.      /* ... */
  3.      $f = \fopen(...); // 调用全局的fopen函数
  4.      return $f;} ?>
复制代码


命名空间的顺序
自从有了命名空间之后,最容易出错的该是使用类的时候,这个类的寻找路径是什么样的了。
  1. <?phpnamespace A;use B\D, C\E as F;// 函数调用foo();      // 首先尝试调用定义在命名空间"A"中的函数foo()
  2.             // 再尝试调用全局函数 "foo"\foo();     // 调用全局空间函数 "foo" my\foo();   // 调用定义在命名空间"A\my"中函数 "foo" F();        // 首先尝试调用定义在命名空间"A"中的函数 "F"
  3.             // 再尝试调用全局函数 "F"// 类引用new B();    // 创建命名空间 "A" 中定义的类 "B" 的一个对象
  4.             // 如果未找到,则尝试自动装载类 "A\B"new D();    // 使用导入规则,创建命名空间 "B" 中定义的类 "D" 的一个对象
  5.             // 如果未找到,则尝试自动装载类 "B\D"new F();    // 使用导入规则,创建命名空间 "C" 中定义的类 "E" 的一个对象
  6.             // 如果未找到,则尝试自动装载类 "C\E"new \B();   // 创建定义在全局空间中的类 "B" 的一个对象
  7.             // 如果未发现,则尝试自动装载类 "B"new \D();   // 创建定义在全局空间中的类 "D" 的一个对象
  8.             // 如果未发现,则尝试自动装载类 "D"new \F();   // 创建定义在全局空间中的类 "F" 的一个对象
  9.             // 如果未发现,则尝试自动装载类 "F"// 调用另一个命名空间中的静态方法或命名空间函数B\foo();    // 调用命名空间 "A\B" 中函数 "foo"B::foo();   // 调用命名空间 "A" 中定义的类 "B" 的 "foo" 方法
  10.             // 如果未找到类 "A\B" ,则尝试自动装载类 "A\B"D::foo();   // 使用导入规则,调用命名空间 nbsp;"B" 中定义的类 "D" 的 "foo" 方法
  11.             // 如果类 "B\D" 未找到,则尝试自动装载类 "B\D"\B\foo();   // 调用命名空间 "B" 中的函数 "foo" \B::foo();  // 调用全局空间中的类 "B" 的 "foo" 方法
  12.             // 如果类 "B" 未找到,则尝试自动装载类 "B"// 当前命名空间中的静态方法或函数A\B::foo();   // 调用命名空间 "A\A" 中定义的类 "B" 的 "foo" 方法
  13.               // 如果类 "A\A\B" 未找到,则尝试自动装载类 "A\A\B"\A\B::foo();  // 调用命名空间 "A\B" 中定义的类 "B" 的 "foo" 方法
  14.               // 如果类 "A\B" 未找到,则尝试自动装载类 "A\B"?>
复制代码

名称解析遵循下列规则:
  • 对完全限定名称的函数,类和常量的调用在编译时解析。例如 new \A\B 解析为类 A\B。
  • 所有的非限定名称和限定名称(非完全限定名称)根据当前的导入规则在编译时进行转换。例如,如果命名空间 A\B\C 被导入为 C,那么对 C\D\e() 的调用就会被转换为 A\B\C\D\e()。
  • 在命名空间内部,所有的没有根据导入规则转换的限定名称均会在其前面加上当前的命名空间名称。例如,在命名空间A\B 内部调用 C\D\e(),则 C\D\e() 会被转换为 A\B\C\D\e() 。
  • 非限定类名根据当前的导入规则在编译时转换(用全名代替短的导入名称)。例如,如果命名空间 A\B\C 导入为C,则 new C() 被转换为 new A\B\C() 。
  • 在命名空间内部(例如A\B),对非限定名称的函数调用是在运行时解析的。例如对函数 foo() 的调用是这样解析的:
    • 在当前命名空间中查找名为 A\B\foo() 的函数
    • 尝试查找并调用 全局(global) 空间中的函数 foo()。

  • 在命名空间(例如A\B)内部对非限定名称或限定名称类(非完全限定名称)的调用是在运行时解析的。下面是调用 new C() 及 new D\E() 的解析过程: new C()的解析:new D\E()的解析:为了引用全局命名空间中的全局类,必须使用完全限定名称 new \C()。
    • 在类名称前面加上当前命名空间名称变成:A\B\D\E,然后查找该类。
    • 尝试自动装载类 A\B\D\E。
    • 在当前命名空间中查找A\B\C类。
    • 尝试自动装载类A\B\C。



回复

使用道具 举报

 楼主| 发表于 2019-11-19 15:50:36 | 显示全部楼层
PHP 面向对象
在面向对象的程序设计(英语:Object-oriented programming,缩写:OOP)中,对象是一个由信息及对信息进行处理的描述所组成的整体,是对现实世界的抽象。
在现实世界里我们所面对的事情都是对象,如计算机、电视机、自行车等。
对象的主要三个特性:
  • 对象的行为:可以对 对象施加那些操作,开灯,关灯就是行为。
  • 对象的形态:当施加那些方法是对象如何响应,颜色,尺寸,外型。
  • 对象的表示:对象的表示就相当于身份证,具体区分在相同的行为与状态下有什么不同。

比如 Animal(动物) 是一个抽象类,我们可以具体到一只狗跟一只羊,而狗跟羊就是具体的对象,他们有颜色属性,可以写,可以跑等行为状态。

面向对象内容
  • − 定义了一件事物的抽象特点。类的定义包含了数据的形式以及对数据的操作。
  • 对象 − 是类的实例。
  • 成员变量 − 定义在类内部的变量。该变量的值对外是不可见的,但是可以通过成员函数访问,在类被实例化为对象后,该变量即可称为对象的属性。
  • 成员函数 − 定义在类的内部,可用于访问对象的数据。
  • 继承 − 继承性是子类自动共享父类数据结构和方法的机制,这是类之间的一种关系。在定义和实现一个类的时候,可以在一个已经存在的类的基础之上来进行,把这个已经存在的类所定义的内容作为自己的内容,并加入若干新的内容。
  • 父类 − 一个类被其他类继承,可将该类称为父类,或基类,或超类。
  • 子类 − 一个类继承其他类称为子类,也可称为派生类。
  • 多态 − 多态性是指相同的操作或函数、过程可作用于多种类型的对象上并获得不同的结果。不同的对象,收到同一消息可以产生不同的结果,这种现象称为多态性。
  • 重载 − 简单说,就是函数或者方法有同样的名称,但是参数列表不相同的情形,这样的同名不同参数的函数或者方法之间,互相称之为重载函数或者方法。
  • 抽象性 − 抽象性是指将具有一致的数据结构(属性)和行为(操作)的对象抽象成类。一个类就是这样一种抽象,它反映了与应用有关的重要性质,而忽略其他一些无关内容。任何类的划分都是主观的,但必须与具体的应用有关。
  • 封装 − 封装是指将现实世界中存在的某个客体的属性与行为绑定在一起,并放置在一个逻辑单元内。
  • 构造函数 − 主要用来在创建对象时初始化对象, 即为对象成员变量赋初始值,总与new运算符一起使用在创建对象的语句中。
  • 析构函数 − 析构函数(destructor) 与构造函数相反,当对象结束其生命周期时(例如对象所在的函数已调用完毕),系统自动执行析构函数。析构函数往往用来做"清理善后" 的工作(例如在建立对象时用new开辟了一片内存空间,应在退出前在析构函数中用delete释放)。

下图中我们通过 Car 类 创建了三个对象:Mercedes, Bmw, 和 Audi。
  1. $mercedes = new Car ();$bmw = new Car ();$audi = new Car ();
复制代码


PHP 类定义
PHP 定义类通常语法格式如下:
  1. <?phpclass phpClass {
  2.   var $var1;
  3.   var $var2 = "constant string";
  4.   
  5.   function myfunc ($arg1, $arg2) {
  6.      [..]
  7.   }
  8.   [..]}?>
复制代码

解析如下:
  • 类使用 class 关键字后加上类名定义。
  • 类名后的一对大括号({})内可以定义变量和方法。
  • 类的变量使用 var 来声明, 变量也可以初始化值。
  • 函数定义类似 PHP 函数的定义,但函数只能通过该类及其实例化的对象访问。

实例
  1. <?phpclass Site {
  2.   /* 成员变量 */
  3.   var $url;
  4.   var $title;
  5.   
  6.   /* 成员函数 */
  7.   function setUrl($par){
  8.      $this->url = $par;
  9.   }
  10.   
  11.   function getUrl(){
  12.      echo $this->url . PHP_EOL;
  13.   }
  14.   
  15.   function setTitle($par){
  16.      $this->title = $par;
  17.   }
  18.   
  19.   function getTitle(){
  20.      echo $this->title . PHP_EOL;
  21.   }}?>
复制代码

变量 $this 代表自身的对象。
PHP_EOL 为换行符。

PHP 中创建对象
类创建后,我们可以使用 new 运算符来实例化该类的对象:
  1. $runoob = new Site;$taobao = new Site;$google = new Site;
复制代码

以上代码我们创建了三个对象,三个对象各自都是独立的,接下来我们来看看如何访问成员方法与成员变量。
调用成员方法
在实例化对象后,我们可以使用该对象调用成员方法,该对象的成员方法只能操作该对象的成员变量:
  1. // 调用成员函数,设置标题和URL$runoob->setTitle( "菜鸟教程" );$taobao->setTitle( "淘宝" );$google->setTitle( "Google 搜索" );$runoob->setUrl( 'www.runoob.com' );$taobao->setUrl( 'www.taobao.com' );$google->setUrl( 'www.google.com' );// 调用成员函数,获取标题和URL$runoob->getTitle();$taobao->getTitle();$google->getTitle();$runoob->getUrl();$taobao->getUrl();$google->getUrl();
复制代码

完整代码如下:
实例
  1. <?php class Site {   /* 成员变量 */   var $url;   var $title;      /* 成员函数 */   function setUrl($par){      $this->url = $par;   }      function getUrl(){      echo $this->url . PHP_EOL;   }      function setTitle($par){      $this->title = $par;   }      function getTitle(){      echo $this->title . PHP_EOL;   } } $runoob = new Site; $taobao = new Site; $google = new Site; // 调用成员函数,设置标题和URL $runoob->setTitle( "菜鸟教程" ); $taobao->setTitle( "淘宝" ); $google->setTitle( "Google 搜索" ); $runoob->setUrl( 'www.runoob.com' ); $taobao->setUrl( 'www.taobao.com' ); $google->setUrl( 'www.google.com' ); // 调用成员函数,获取标题和URL $runoob->getTitle(); $taobao->getTitle(); $google->getTitle(); $runoob->getUrl(); $taobao->getUrl(); $google->getUrl(); ?>
复制代码

运行结果:

  1. 阿里云大学
  2. 淘宝
  3. Google 搜索
  4. www.runoob.com
  5. www.taobao.com
  6. www.google.com
复制代码




执行以上代码,输出结果为:
  1. 阿里云大学淘宝Google 搜索www.runoob.com
  2. www.taobao.com
  3. www.google.com
复制代码


PHP 构造函数
构造函数 ,是一种特殊的方法。主要用来在创建对象时初始化对象, 即为对象成员变量赋初始值,总与new运算符一起使用在创建对象的语句中。
PHP 5 允行开发者在一个类中定义一个方法作为构造函数,语法格式如下:
  1. void __construct ([ mixed $args [, $... ]] )
复制代码

在上面的例子中我们就可以通过构造方法来初始化 $url 和 $title 变量:
  1. function __construct( $par1, $par2 ) {
  2.    $this->url = $par1;
  3.    $this->title = $par2;}
复制代码

现在我们就不需要再调用 setTitle 和 setUrl 方法了:
实例
  1. $runoob = new Site('www.runoob.com', '阿里云大学');
  2. $taobao = new Site('www.taobao.com', '淘宝');
  3. $google = new Site('www.google.com', 'Google 搜索');
  4. // 调用成员函数,获取标题和URL
  5. $runoob->getTitle();
  6. $taobao->getTitle();
  7. $google->getTitle();
  8. $runoob->getUrl();
  9. $taobao->getUrl();
  10. $google->getUrl();
复制代码



运行结果:

  1. 阿里云大学
  2. 淘宝
  3. Google 搜索
  4. www.runoob.com
  5. www.taobao.com
  6. www.google.com
复制代码





析构函数
析构函数(destructor) 与构造函数相反,当对象结束其生命周期时(例如对象所在的函数已调用完毕),系统自动执行析构函数。
PHP 5 引入了析构函数的概念,这类似于其它面向对象的语言,其语法格式如下:
  1. void __destruct ( void )
复制代码

实例
  1. <?phpclass MyDestructableClass {
  2.    function __construct() {
  3.        print "构造函数\n";
  4.        $this->name = "MyDestructableClass";
  5.    }

  6.    function __destruct() {
  7.        print "销毁 " . $this->name . "\n";
  8.    }}$obj = new MyDestructableClass();?>
复制代码

执行以上代码,输出结果为:
  1. 构造函数销毁 MyDestructableClass
复制代码


继承
PHP 使用关键字 extends 来继承一个类,PHP 不支持多继承,格式如下:
  1. class Child extends Parent {
  2.    // 代码部分}
复制代码

实例
实例中 Child_Site 类继承了 Site 类,并扩展了功能:
  1. <?php
  2. // 子类扩展站点类别class Child_Site extends Site {
  3.    var $category;

  4.         function setCate($par){
  5.                 $this->category = $par;
  6.         }
  7.   
  8.         function getCate(){
  9.                 echo $this->category . PHP_EOL;
  10.         }}
复制代码


方法重写
如果从父类继承的方法不能满足子类的需求,可以对其进行改写,这个过程叫方法的覆盖(override),也称为方法的重写。
实例中重写了 getUrl 与 getTitle 方法:
  1. function getUrl() {
  2.    echo $this->url . PHP_EOL;
  3.    return $this->url;}
  4.    function getTitle(){
  5.    echo $this->title . PHP_EOL;
  6.    return $this->title;}
复制代码


访问控制
PHP 对属性或方法的访问控制,是通过在前面添加关键字 public(公有),protected(受保护)或 private(私有)来实现的。
  • public(公有):公有的类成员可以在任何地方被访问。
  • protected(受保护):受保护的类成员则可以被其自身以及其子类和父类访问。
  • private(私有):私有的类成员则只能被其定义所在的类访问。

属性的访问控制
类属性必须定义为公有,受保护,私有之一。如果用 var 定义,则被视为公有。
  1. <?php/**
  2. * Define MyClass
  3. */class MyClass{
  4.     public $public = 'Public';
  5.     protected $protected = 'Protected';
  6.     private $private = 'Private';

  7.     function printHello()
  8.     {
  9.         echo $this->public;
  10.         echo $this->protected;
  11.         echo $this->private;
  12.     }}$obj = new MyClass();echo $obj->public; // 这行能被正常执行echo $obj->protected; // 这行会产生一个致命错误echo $obj->private; // 这行也会产生一个致命错误$obj->printHello(); // 输出 Public、Protected 和 Private/**
  13. * Define MyClass2
  14. */class MyClass2 extends MyClass{
  15.     // 可以对 public 和 protected 进行重定义,但 private 而不能
  16.     protected $protected = 'Protected2';

  17.     function printHello()
  18.     {
  19.         echo $this->public;
  20.         echo $this->protected;
  21.         echo $this->private;
  22.     }}$obj2 = new MyClass2();echo $obj2->public; // 这行能被正常执行echo $obj2->private; // 未定义 privateecho $obj2->protected; // 这行会产生一个致命错误$obj2->printHello(); // 输出 Public、Protected2 和 Undefined?>
复制代码

方法的访问控制
类中的方法可以被定义为公有,私有或受保护。如果没有设置这些关键字,则该方法默认为公有。
  1. <?php/**
  2. * Define MyClass
  3. */class MyClass{
  4.     // 声明一个公有的构造函数
  5.     public function __construct() { }

  6.     // 声明一个公有的方法
  7.     public function MyPublic() { }

  8.     // 声明一个受保护的方法
  9.     protected function MyProtected() { }

  10.     // 声明一个私有的方法
  11.     private function MyPrivate() { }

  12.     // 此方法为公有
  13.     function Foo()
  14.     {
  15.         $this->MyPublic();
  16.         $this->MyProtected();
  17.         $this->MyPrivate();
  18.     }}$myclass = new MyClass;$myclass->MyPublic(); // 这行能被正常执行$myclass->MyProtected(); // 这行会产生一个致命错误$myclass->MyPrivate(); // 这行会产生一个致命错误$myclass->Foo(); // 公有,受保护,私有都可以执行/**
  19. * Define MyClass2
  20. */class MyClass2 extends MyClass{
  21.     // 此方法为公有
  22.     function Foo2()
  23.     {
  24.         $this->MyPublic();
  25.         $this->MyProtected();
  26.         $this->MyPrivate(); // 这行会产生一个致命错误
  27.     }}$myclass2 = new MyClass2;$myclass2->MyPublic(); // 这行能被正常执行$myclass2->Foo2(); // 公有的和受保护的都可执行,但私有的不行class Bar {
  28.     public function test() {
  29.         $this->testPrivate();
  30.         $this->testPublic();
  31.     }

  32.     public function testPublic() {
  33.         echo "Bar::testPublic\n";
  34.     }
  35.    
  36.     private function testPrivate() {
  37.         echo "Bar::testPrivate\n";
  38.     }}class Foo extends Bar {
  39.     public function testPublic() {
  40.         echo "Foo::testPublic\n";
  41.     }
  42.    
  43.     private function testPrivate() {
  44.         echo "Foo::testPrivate\n";
  45.     }}$myFoo = new foo();$myFoo->test(); // Bar::testPrivate
  46.                 // Foo::testPublic?>
复制代码


接口
使用接口(interface),可以指定某个类必须实现哪些方法,但不需要定义这些方法的具体内容。
接口是通过 interface 关键字来定义的,就像定义一个标准的类一样,但其中定义所有的方法都是空的。
接口中定义的所有方法都必须是公有,这是接口的特性。
要实现一个接口,使用 implements 操作符。类中必须实现接口中定义的所有方法,否则会报一个致命错误。类可以实现多个接口,用逗号来分隔多个接口的名称。
  1. <?php// 声明一个'iTemplate'接口interface iTemplate{
  2.     public function setVariable($name, $var);
  3.     public function getHtml($template);}// 实现接口class Template implements iTemplate{
  4.     private $vars = array();
  5.   
  6.     public function setVariable($name, $var)
  7.     {
  8.         $this->vars[$name] = $var;
  9.     }
  10.   
  11.     public function getHtml($template)
  12.     {
  13.         foreach($this->vars as $name => $value) {
  14.             $template =&nbnbsp;str_replace('{' . $name . '}', $value, $template);
  15.         }

  16.         return $template;
  17.     }}
复制代码


常量
可以把在类中始终保持不变的值定义为常量。在定义和使用常量的时候不需要使用 $ 符号。
常量的值必须是一个定值,不能是变量,类属性,数学运算的结果或函数调用。
自 PHP 5.3.0 起,可以用一个变量来动态调用类。但该变量的值不能为关键字(如 self,parent 或 static)。
实例
  1. <?phpclass MyClass{
  2.     const constant = '常量值';

  3.     function showConstant() {
  4.         echo  self::constant . PHP_EOL;
  5.     }}echo MyClass::constant . PHP_EOL;$classname = "MyClass";echo $classname::constant . PHP_EOL; // 自 5.3.0 起$class = new MyClass();$class->showConstant();echo $class::constant . PHP_EOL; // 自 PHP 5.3.0 起?>
复制代码


抽象类
任何一个类,如果它里面至少有一个方法是被声明为抽象的,那么这个类就必须被声明为抽象的。
定义为抽象的类不能被实例化。
被定义为抽象的方法只是声明了其调用方式(参数),不能定义其具体的功能实现。
继承一个抽象类的时候,子类必须定义父类中的所有抽象方法;另外,这些方法的访问控制必须和父类中一样(或者更为宽松)。例如某个抽象方法被声明为受保护的,那么子类中实现的方法就应该声明为受保护的或者公有的,而不能定义为私有的。此外方法的调用方式必须匹配,即类型和所需参数数量必须一致。例如,子类定义了一个可选参数,而父类抽象方法的声明里没有,则两者的声明并无冲突。
  1. <?phpabstract class AbstractClass{
  2. // 强制要求子类定义这些方法
  3.     abstract protected function getValue();
  4.     abstract protected function prefixValue($prefix);

  5.     // 普通方法(非抽象方法)
  6.     public function printOut() {
  7.         print $this->getValue() . PHP_EOL;
  8.     }}class ConcreteClass1 extends AbstractClass{
  9.     protected function getValue() {
  10.         return "ConcreteClass1";
  11.     }

  12.     public function prefixValue($prefix) {
  13.         return "{$prefix}ConcreteClass1";
  14.     }}class ConcreteClass2 extends AbstractClass{
  15.     public function getValue() {
  16.         return "ConcreteClass2";
  17.     }

  18.     public function prefixValue($prefix) {
  19.         return "{$prefix}ConcreteClass2";
  20.     }}$class1 = new ConcreteClass1;$class1->printOut();echo $class1->prefixValue('FOO_') . PHP_EOL;$class2 = new ConcreteClass2;$class2->printOut();echo $class2->prefixValue('FOO_') . PHP_EOL;?>
复制代码

执行以上代码,输出结果为:
  1. ConcreteClass1FOO_ConcreteClass1ConcreteClass2FOO_ConcreteClass2
复制代码


Static 关键字
声明类属性或方法为 static(静态),就可以不实例化类而直接访问。
静态属性不能通过一个类已实例化的对象来访问(但静态方法可以)。
由于静态方法不需要通过对象即可调用,所以伪变量 $this 在静态方法中不可用。
静态属性不可以由对象通过 -> 操作符来访问。
自 PHP 5.3.0 起,可以用一个变量来动态调用类。但该变量的值不能为关键字 self,parent 或 static。
  1. <?phpclass Foo {
  2.   public static $my_static = 'foo';
  3.   
  4.   public function staticValue() {
  5.      return self::$my_static;
  6.   }}print Foo::$my_static . PHP_EOL;$foo = new Foo();print $foo->staticValue() . PHP_EOL;?>       
复制代码

执行以上程序,输出结果为:
  1. foo
  2. foo
复制代码


Final 关键字
PHP 5 新增了一个 final 关键字。如果父类中的方法被声明为 final,则子类无法覆盖该方法。如果一个类被声明为 final,则不能被继承。
以下代码执行会报错:
  1. <?phpclass BaseClass {
  2.    public function test() {
  3.        echo "BaseClass::test() called" . PHP_EOL;
  4.    }
  5.    
  6.    final public function moreTesting() {
  7.        echo "BaseClass::moreTesting() called"  . PHP_EOL;
  8.    }}class ChildClass extends BaseClass {
  9.    public function moreTesting() {
  10.        echo "ChildClass::moreTesting() called"  . PHP_EOL;
  11.    }}// 报错信息 Fatal error: Cannot override final method BaseClass::moreTesting()?>
复制代码


调用父类构造方法
PHP 不会在子类的构造方法中自动的调用父类的构造方法。要执行父类的构造方法,需要在子类的构造方法中调用 parent::__construct()
  1. <?phpclass BaseClass {
  2.    function __construct() {
  3.        print "BaseClass 类中构造方法" . PHP_EOL;
  4.    }}class SubClass extends BaseClass {
  5.    function __construct() {
  6.        parent::__construct();  // 子类构造方法不能自动调用父类的构造方法
  7.        print "SubClass 类中构造方法" . PHP_EOL;
  8.    }}class OtherSubClass extends BaseClass {
  9.     // 继承 BaseClass 的构造方法}// 调用 BaseClass 构造方法$obj = new BaseClass();// 调用 BaseClass、SubClass 构造方法$obj = new SubClass();// 调用 BaseClass 构造方法$obj = new OtherSubClass();?>
复制代码

执行以上程序,输出结果为:
  1. BaseClass 类中构造方法BaseClass 类中构造方法SubClass 类中构造方法BaseClass 类中构造方法
复制代码



回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

精彩图文



在线客服(工作时间:9:00-22:00)
400-600-6565

内容导航

微信客服

Copyright   ©2015-2019  云服务器社区  Powered by©Discuz!  技术支持:尊托网络     ( 湘ICP备15009499号-1 )