多维数组
- 多维数组指的是包含一个或多个数组的数组。
- PHP 能理解两、三、四或五级甚至更多级的多维数组。不过,超过三级深的数组对于大多数人难于管理。
- 注释:数组的维度指示您需要选择元素的索引数。
- 对于二维数组,您需要两个索引来选取元素
- 对于三维数组,您需要三个索引来选取元素
示例代码
<?php
$cars = array
(
array("Volvo",33,20),
array("BMW",17,15),
array("Saab",5,2),
array("Land Rover",15,11)
);
现在这个两维数组包含了四个数组,并且它有两个索引(下标):行和列。
如需访问 $cars 数组中的元素,我们必须使用两个索引(行和列):
echo $cars[0][0].": 库存:".$cars[0][1].", 已售:".$cars[0][2].".<br>";
echo $cars[1][0].": 库存:".$cars[1][1].", 已售:".$cars[1][2].".<br>";
echo $cars[2][0].": 库存:".$cars[2][1].", 已售:".$cars[2][2].".<br>";
echo $cars[3][0].": 库存:".$cars[3][1].", 已售:".$cars[3][2].".<br>";
?>
运行结果:
Volvo: 库存:33, 已售:20.
BMW: 库存:17, 已售:15.
Saab: 库存:5, 已售:2.
Land Rover: 库存:15, 已售:11.
FOR循环的代码
<?php
$cars = array
(
array("Volvo",33,20),
array("BMW",17,15),
array("Saab",5,2),
array("Land Rover",15,11)
);
for ($row = 0; $row < 4; $row++) {
echo "<p><b>行数 $row</b></p>";
echo "<ul>";
for ($col = 0; $col < 3; $col++) {
echo "<li>".$cars[$row][$col]."</li>";
}
echo "</ul>";
}
?>
我们也可以在 For 循环中使用另一个 For 循环,来获得 $cars 数组中的元素(我们仍需使用两个索引):
行数 0
Volvo
33
20
行数 1
BMW
17
15
行数 2
Saab
5
2
行数 3
Land Rover
15
11
Directory函数
- chdir() 改变当前的目录。
- chroot() 改变根目录。
- closedir() 关闭目录句柄。
- dir() 返回 Directory 类的实例。
- getcwd() 返回当前工作目录。
- opendir() 打开目录句柄。
- readdir() 返回目录句柄中的条目。
- rewinddir() 重置目录句柄。
- scandir() 返回指定目录中的文件和目录的数组。、
Filesystem函数
Filesystem函数允许您访问和操作文件系统。
- unix和Windows兼容性问题
- 当在 Unix 平台上规定路径时,正斜杠 (/) 用作目录分隔符。而在 Windows 平台上,正斜杠 (/) 和反斜杠 (\ ) 均可使用。
使用中查手册的key函数
- php filter:PHP 过滤器用于对来自非安全来源的数据(比如用户输入)进行验证和过滤。
- php ftp:通过文件传输协议(FTP)提供对文件服务器的客户端访问。
- php http:允许您在其他输出被发送之前,对由web服务器发送到浏览器的信息进行操作。
- php libxml:Libxml 函数和常量与 SimpleXML、XSLT 以及 DOM 函数一起使用。
- php mail:mail() 函数允许您从脚本中直接发送电子邮件。
- php math:Math 函数能处理 integer 和 float 范围内的值。
- php 杂项函数:我们把不属于其他类别的函数归纳到杂项函数类别。
- php pdo:php数据对象(pdo)扩展为php访问数据库定义了一个轻量级的一致接口。
- php simplexml:提供了一种获取xml元素名称和文本的简单方式。
- php string:PHP String 函数是 PHP 核心的组成部分。无需安装即可使用这些函数。
- php xml parse:XML 函数允许您解析 XML 文档,但无法对其进行验证。
- php zip file:Zip File 函数允许您读取压缩文件。
- php time zones:支持的时区。
- php 图像处理:PHP 提供了丰富的图像处理函数。
- php restful(Representational State Transfer):一种架构约束条件和原则。
REST(英文:Representational State Transfer,简称REST) ,指的是一组架构约束条件和原则。
- 符合REST设计风格的Web API称为RESTful API。它从以下三个方面资源进行定义:
- 直观简短的资源地址:URI,比如:http://example.com/resources/。
- 传输的资源:Web服务接受与返回的互联网媒体类型,比如:JSON,XML,YAM等。
- 对资源的操作:Web服务在该资源上所支持的一系列请求方法(比如:POST,GET,PUT或DELETE)。
基本语法回顾
- static:让局部变量不被删除。(在php中,当一个函数执行完,函数中的变量通常都会被删除)
- 注意:将static定义在函数内部
- 参数作用域:参数是通过调用代码将值传递给函数的局部变量,作为函数声明的一部分。
<?php
function myTest($x)
{
echo $x;
}
myTest(5);
?>
- echo语句
- echo和Print输出字符串都可以包含html标签
- echo和Print的区别是
- echo可以输出一个或者多个字符串,没有返回值
- print只允许输出一个字符串,返回值是1
- PHP对象
- 对象数据类型也可以用于存储数据。
- 在php中,对象必须声明:
- 必须用class关键字声明类对象。类是可以包含属性和方法的结构。
- 在类中定义数据类型,在实例化的类中使用数据类型。
<?php
class Car
{
var $color;
function Car($color="green") {
$this->color = $color;
}
function what_color() {
return $this->color;
}
}
?>
- PHP关键字this就是指向当前对象实例的指针,不指向任何其他对象或类。
- NULL值
- NULL值表示变量没有值,NULL是数据类型为NULL的值。
- 常用场景1:设置变量值为 NULL 来清空变量数据:
- 常用场景2:NULL 值指明一个变量是否为空值。 同样可用于数据空值和NULL值的区别。
- php常量
- 常量名不需要加$修饰符,用define(x,x,x)关键字定义常量。
- 注意:常量在整个脚本中都可以被使用
bool define ( string $name , mixed $value [, bool $case_insensitive = false ] )
- name:必选参数,常量名称,即标志符。
- value:必选参数,常量的值。
- case_insensitive :可选参数,如果设置为TRUE,不区分大小写。默认是大小写敏感的。
- 运算符
- php7+新增的整除运算符:intdiv():
<?php
var_dump(intdiv(10, 3));
?>
输出结果是int(3)
- a.=b的意思是:a = a.b;
$x="Hello";
$x .= " world!";
echo $x; // outputs Hello world!
- php递增递减运算符:++x x++,--x,x--:
- ++x:x先加1,再返回x
- x++:先返回x,再加1
- --x,x--同理
<?php
$x=10;
echo ++$x; // 输出11
$y=10;
echo $y++; // 输出10
$z=5;
echo --$z; // 输出4
$i=5;
echo $i--; // 输出5
?>
- php比较运算符
- x === y 恒等于 如果 x 等于 y,且它们类型相同,则返回 true 5==="5" 返回 false
- x <> y(或者x != y) 不等于 如果 x 不等于 y,则返回 true 5<>8 返回 true
- x !== y 不恒等于 如果 x 不等于 y,或它们类型不相同,则返回 true 5!=="5" 返回 true
- php逻辑运算符
- x or y 或 如果 x 和 y 至少有一个为 true,则返回 true
x=6
y=3
(x==6 or y==5) 返回 true
- x xor y 异或 如果 x 和 y 有且仅有一个为 true,则返回 true
x=6
y=3
(x==6 xor y==3) 返回 false
- php数组运算符
- x == y 相等: 如果 x 和 y 具有相同的键/值对,则返回 true
- x === y 恒等: 如果 x 和 y 具有相同的键/值对,且顺序相同类型相同,则返回 true
- x !== y 不恒等 如果 x 不等于 y,则返回 true
- 三元运算符
(expr1) ? (expr2) : (expr3)
- expr1 求值为 TRUE 时的值为 expr2,在 expr1 求值为 FALSE 时的值为 expr3。
- 自 PHP 5.3 起,可以省略三元运算符中间那部分。表达式 expr1 ?: expr3 在 expr1 求值为 TRUE 时返回 expr1,否则返回 expr3。
示例代码:
<?php
$test = '菜鸟教程';
// 普通写法
$username = isset($test) ? $test : 'nobody';
echo $username, PHP_EOL;
// PHP 5.3+ 版本写法
$username = $test ?: 'nobody';
echo $username, PHP_EOL;
?>
- 注意:PHP_EOL 是一个换行符,兼容更大平台。比如Windows下的/n/r
- NULL合并运算符 (php7新增)
<?php
// 如果 $_GET['user'] 不存在返回 'nobody',否则返回 $_GET['user'] 的值
$username = $_GET['user'] ?? 'nobody';
// 类似的三元运算符
$username = isset($_GET['user']) ? $_GET['user'] : 'nobody';
?>
- 组合比较符(php7+新增)
- 语法是这样的:$c = $a <=> $b;
echo 2 <=> 1; // 1
echo 1 <=> 1; // 0
echo 1 <=> 2; // -1
如果$a > $b, $c 的值为1
如果$a == $b, $c 的值为0
如果$a < $b, $c 的值为-1
数组 array()
- 在 PHP 中,有三种类型的数组:
- 数值数组 - 带有数字 ID 键的数组
- 关联数组 - 带有指定的键的数组,每个键关联一个值
- 多维数组 - 包含一个或多个数组的数组
<?php
//php的数值数组
$test = array("who","are","you");
$alength = count($test);
for($x=0;$x<$alength;$x++){
echo $test[$x];
echo "<br>";
}
打印结果:
who
are
you
//php的关联数组
$connectArray = array('first'=>'maiyatian',
'second'=>'huawei',
'third'=>666);
echo $connectArray['first'].'-'.$connectArray['second'].'@'.$connectArray['third'].'<br>';
打印结果:
maiyatian-huawei@666
//遍历关联数组
$age = array('jason'=>12,
'mike'=>34,
'jenny'=>23);
foreach ($age as $x=>$x_value){
echo 'key:'.$x.' Value:'.$x_value.'<br>';
}
打印结果:
key:jason Value:12
key:mike Value:34
key:jenny Value:23
?>
- 数组排序
数组中的元素可以按字母或数字顺序进行降序或升序排列。
- sort() - 对数组进行升序排列
- rsort() - 对数组进行降序排列
- asort() - 根据关联数组的值,对数组进行升序排列
- ksort() - 根据关联数组的键,对数组进行升序排列
- arsort() - 根据关联数组的值,对数组进行降序排列
- krsort() - 根据关联数组的键,对数组进行降序排列
PHP超级全局变量
PHP中预定义了几个超级全局变量(superglobals) ,这意味着它们在一个脚本的全部作用域中都可用。 你不需要特别说明,就可以在函数及类中使用。
- $GLOBALS
- $_SERVER
- $_REQUEST
- $_POST
- $_GET
- $_FILES
- $_ENV
- $_COOKIE
- $_SESSION
详解
- $GLOBALS
- $GLOBALS 是PHP的一个超级全局变量组,在一个PHP脚本的全部作用域中都可以访问。
- $GLOBALS是包含了全部变量的全局组合数组。变量的名字就是数组的键(KEY)\
$x=25;
$y=75;
function submit(){
$GLOBALS['z'] = $GLOBALS['x']+$GLOBALS['y'];
}
submit();
echo $z;
注意:
- $GLOBALS['']中括号里面需要用引号''来指定全局中定义的变量
- 实例中 z 是一个$GLOBALS数组中的超级全局变量,该变量同样可以在函数外访问。
- $_SERVER
- 也是一个数组:包含了诸如头信息(header)、路径(path)以及脚本信息(script)等等信息的数组。
- 数组中的项目由 Web 服务器创建。不能保证每个服务器都提供全部项目
- 服务器可能会忽略一些,或者提供一些没有在这里列举出来的项目。
- 具体参数比较多,可以参考手册
- PHP $_REQUEST
- 用于收集HTML表单提交的数据。
<html>
<form method=post action='<?php echo $_SERVER['PHP_SELF'];?>'>
Name:<input type='text' name='fname' />
<input type=submit>
</form>
<?php
$name = $_REQUEST['fname'];
echo $name;
?>
</html>
$_REQUEST结果
- PHP $_POST
- PHP $_POST 被广泛应用于收集表单数据,在HTML form标签的指定该属性:"method="post"。
//在php中以$_POST的方式获得html中post提交的数据
<form method=post action='<?php echo $_SERVER['PHP_SELF'];?>'>
Name:<input type='text' name='fname' />
<input type=submit>
</form>
<?php
$name = $_POST['fname'];
echo $name;
?>
- PHP $_GET
- 和$_POST一样用来收集表单数据,在HTML form标签中指定该属性:"method='get'"。
- $_GET 也可以收集URL中发送的消息
<a href="test.php?subject=PHP&web=runoob.com">测试 $_GET</a>
<?php
echo "Study " . $_GET['subject'] . " at " . $_GET['web'];
?>
ForEach循环
用于遍历数组
<html>
<body>
<?php
$beijings = array('beibei','jingjing','huanhuan','yingying','nini');
foreach ($beijings as $beijing){
echo $beijing."<br>";
}
?>
</body>
</html>
PHP函数
- 创建php函数
function functionName()
{
要执行的代码;
}
- 函数的名称应该提示出它的功能
- 函数名称以字母或下划线开头(不能以数字开头)
自定义函数示例
function myFunc($x, $y)
{
$total = $x + $y;
return $total;
}
echo 'operation:'.myfunc(1,3);
- 带返回值 return
- 传递参数,单参数或者多参数,建议最多参数不要超过3个;超过3个用数组。
PHP魔术变量之 TRAIT代码复用
- 自 PHP 5.4.0 起,PHP 实现了代码复用的一个方法,称为 traits。
- Trait 名包括其被声明的作用区域(例如 Foo\Bar)。
//魔法变量之 trait
class base
{
public function sayHello()
{
echo 'hello';
}
}
trait sayhello
{
public function sayHello()
{
parent::sayHello();
echo 'world';
}
}
class myHelloWord extends base
{
use sayHello;
}
$o = new myHelloWord();
$o->sayhello();
如果是有基础的同学,那么看上面的代码是非常好理解的:
- 优先顺序是当前类中的方法会覆盖 trait 方法,而 trait 方法又覆盖了基类中的方法。
其他PHP魔术变量
- LINE
- FILE
- DIR
- FUNCTION
- CLASS
- METHOD
-
NAMESPACE
具体使用请参看手册
PHP命名空间(namespace)
php命名空间解决的问题
- 用户编写的代码与PHP内部的类/函数/常量或第三方类/函数/常量之间的名字冲突。
- 为很长的标识符名称(通常是为了缓解第一类问题而定义的)创建一个别名(或简短)的名称,提高源代码的可读性。
在同一个文件下定义不同的命名空间
< ?php
namespace MyProject1;
// MyProject1 命名空间中的PHP代码
namespace MyProject2;
// MyProject2 命名空间中的PHP代码
// 另一种语法
namespace MyProject3 {
// MyProject3 命名空间中的PHP代码
}
?>
注意:
- 如果一个文件中包含命名空间,它必须在其它所有代码之前声明命名空间
- 在声明命名空间之前唯一合法的代码是用于定义源文件编码方式的 declare 语句。
- 比如:下面的代码就会出错,命名空间必须是程序脚本的第一条语句
<html>
<?php
namespace MyProject; // 命名空间前出现了“<html>” 会致命错误
?>
子命名空间
- 与目录和文件的关系很象,PHP 命名空间也允许指定层次化的命名空间的名称。因此,命名空间的名字可以使用分层次的方式定义:
<?php
namespace MyProject\Sub\Level; //声明分层次的单个命名空间
const CONNECT_OK = 1;
class Connection { /* ... */ }
function Connect() { /* ... */ }
?>
上面的例子创建了常量 MyProject\Sub\Level\CONNECT_OK,类 MyProject\Sub\Level\Connection 和函数 MyProject\Sub\Level\Connect。
- 注意访问任意全局类、函数或常量,都可以使用完全限定名称,例如 \strlen() 或 \Exception 或 \INI_ALL。
<?php
namespace Foo\Bar;
include 'file1.php';
const FOO = 2;
function foo() {}
class foo
{
static function staticmethod() {}
}
/* 非限定名称 */
foo(); // 解析为 Foo\Bar\foo resolves to function Foo\Bar\foo
foo::staticmethod(); // 解析为类 Foo\Bar\foo的静态方法staticmethod。resolves to class Foo\Bar\foo, method staticmethod
echo FOO; // resolves to constant Foo\Bar\FOO
/* 限定名称 */
subnamespace\foo(); // 解析为函数 Foo\Bar\subnamespace\foo
subnamespace\foo::staticmethod(); // 解析为类 Foo\Bar\subnamespace\foo,
// 以及类的方法 staticmethod
echo subnamespace\FOO; // 解析为常量 Foo\Bar\subnamespace\FOO
/* 完全限定名称 */
\Foo\Bar\foo(); // 解析为函数 Foo\Bar\foo
\Foo\Bar\foo::staticmethod(); // 解析为类 Foo\Bar\foo, 以及类的方法 staticmethod
echo \Foo\Bar\FOO; // 解析为常量 Foo\Bar\FOO
?>
- 在命名空间内部访问全局类、函数和常量:
<?php
namespace Foo;
function strlen() {}
const INI_ALL = 3;
class Exception {}
$a = \strlen('hi'); // 调用全局函数strlen
$b = \INI_ALL; // 访问全局常量 INI_ALL
$c = new \Exception('error'); // 实例化全局类 Exception
?>
延伸之const用法
- 在类里面定义常量用 const 关键字,而不是通常的 define() 函数。
- 常量的值一旦被定义后就不可在程序中更改。
<?php
Class Person{
// 定义常量
const country = "中国";
public function myCountry() {
//内部访问常量
echo "我是".self::country."人<br />";
}
}
// 输出常量
echo Person::country."<br />";
// 访问方法
$p1 = new Person();
$p1 -> myCountry();
?>
结果:
中国
我是中国人
网友评论