PHP_notes_02

■PHP的函数

函数的作用:
①函数的作用是提高代码的复用性。
②函数在构造对象中作为方法时,代表一种功能。

● PHP 中定义函数的一般形式:

function 函数名(形参1,形参2,……){
return 返回值;
}

● PHP 中调用函数的一般形式:

$接收返回值的变量 = 函数名(实参1,实参2,……);


★函数执行结束的两种情况:
①函数执行完毕;
②函数遇到return 返回。


★调用函数的原理:
PHP执行时,一旦遇到函数的调用,就会开辟一个新栈用于执行该函数的代码,函数执行完毕后,返回到原本的栈中继续执行后续的代码。

【图片:PHP调用函数的原理_示意图.png】

谨记:PHP执行时,只要一遇到 调用函数的语句 ,马上就为这个函数开辟新的栈(★后进先出)。
例如,函数的递归调用:

【图片:PHP函数的递归调用_示意图.png】


★PHP函数默认参数:(注意:默认值要放到最后!)
例如:

/* 如果一个参数有默认值,则应该把它放到最后。*/
function abc($b,$a=2){
$res = $a + $b;
return $res;
}

echo abc(10); //输出:12
echo abc(10,15); //输出:25


★引用传递:
PHP中 函数参数的传递方式默认为【单向值传递】(与C一样),如果需要用【引用传递】,可以如下:

$a = 246;
function abc(&$b){
$b = 135;
}
abc($a);
echo $a; //输出:135


★动态调用函数:
动态调用函数有两种方法:

①通过动态函数名,实现动态调用函数,例如:

function a($a,$b){
echo $a+$b,'<br />';
}

function b($a,$b){
echo $a*$b,'<br />';
}
$func_name_01 = 'a';
$func_name_02 = 'b';

$func_name_01(2,3);// 输出:5
$func_name_02(2,3);// 输出:6

②通过 call_user_func() 函数,实现动态调用函数,例如:

call_user_func('a',2,3);// 输出:5
还可以用:call_user_func_array() 函数,例如:

call_user_func_array('a',array(2,3));// 输出:5
// 它与 call_user_func_array的区别是 把所有参数组成一个数组进行传递。


■PHP的全局变量

在PHP中,一般的变量(在函数之外定义的变量),就是全局变量。
在PHP中,如果想在函数中使用全局变量,必须声明。
(在 C语言 中不是必须声明的,要看具体情况。如果全局变量的定义在 函数的定义之前,就可以在函数中直接使用。)

声明全局变量:
注意:要在函数体内声明已有的变量为全局变量,在函数体外声明无效。
方法一、使用 global 关键字:
global $变量名;

方法二、使用超全局数组变量 $GLOBALS['……'] :
$GLOBALS['变量名']

注意:我们还可以通过 $GLOBALS 在函数内 定义 全局变量。


■超全局变量

PHP中 的许多预定义变量都是“超全局的”,这意味着它们在一个脚本的全部作用域中都可用。在函数或方法中无需执行 global $variable; 就可以访问它们。

这些超全局变量是:

$GLOBALS ——引用全局作用域中可用的全部变量
$_SERVER ——服务器和执行环境信息
$_GET ——HTTP GET 变量
$_POST ——HTTP POST 变量
$_FILES ——HTTP 文件上传变量
$_COOKIE ——HTTP Cookies
$_SESSION ——Session 变量
$_REQUEST ——HTTP Request 变量
$_ENV ——环境变量

如果超全局变量没有内容,就证明没有开启。
在 php.ini 中找到 variables_order ,然后在后面加上超全局变量的大写首英文字母。
例如:variables_order="GPCSE"

(另外,这些大写英文字母 按不同的顺序也代表着不同的意思。具体自己百度。) 

因为这些预定义变量中,有某些(例如:$_ENV)会曝露服务器以及操作系统的信息,所以默认不开启。推荐不要开启 $_ENV 。避免 探测程序(简称‘探针’),探测到敏感的信息。

若想了解 环境变量 的信息,可以通过函数 getenv() 实现。
例如:getenv('OS'); //输出服务器的操作系统名字


■ $_GET 和 $_POST

$_GET 与 $_POST 都是数组。


★ $_GET  ——作用:通过 URL 参数传递给当前脚本的变量的数组。

例如,用户访问的是 http://example.com/?name=Jay&id=2

<?php
echo 'Name: ',$_GET['name'],'<br />';// 输出:Name: Jay
echo 'Id: ',$_GET['id'],'<br />';// 输出:Id: 2
?>


★ $_POST  ——作用:通过 HTTP POST 方法传递给当前脚本的变量的数组。

HTML 表单中 <input > 的 name属性的值,对应 POST数组 的'键'。例如:

.html 中:
<form action="test.php" method="post">
用户名:<input type="text" name="username" /><br />
email:<input type="text" name="email" /><br />
密码:<input type="password" name="passwd" /><br />
<input type="submit" value="提交"/>
</form>

.php 中:
echo 'UserName: ',$_POST['username'],'<br />';
echo 'email: ',$_POST['email'],'<br />';
echo 'PassWord: ',$_POST['passwd'],'<br />';


★GET 与 POST 的区别:

1、安全性,GET请求的数据会显示在地址栏上,POST请求的数据放在 http请求的实体内容(消息体)里面。
2、从可提交数据的最大值来看:
http协议并没有限制提交数据的大小,但 浏览器 和 webserver 对 GET请求提交数据的最大值有限制,最大值为2k+35B 即 2083字节(B)。
注意:POST请求比较适宜提交较大量的数据,但也不是无限大的,其主要受到webserver的限制,比如在 php.ini 中设置最大上传文件大小:upload_max_filesize = 2M
3、因为 GET请求作用在 URL ,而收藏夹所保存的正是 URL 所以 GET请求可以更好的添加到收藏夹。
4、如果要上传文件,必须要用 POST请求。


■检查 变量、常量、函数 是否已定义

isset ——作用:检查变量是否已定义,判断变量存不存在。
例如:var_dump(isset($a));// 如果输出:bool(false) ,说明该变量不存在。

empty ——作用:检查一个变量是否为空。
例如:var_dump(empty($a));// 如果输入:bool(true) ,说明该变量是空的。

defined ——作用:检查某个名称的常量是否存在。
例如:var_dump(defined('ABC'));// 如果输出:bool(false),说明该常量不存在。

★惯用法:
defined('常量名') || define('常量名',常量值);// 利用逻辑运算符的“短路特性”。
//以上代码的作用是:检查常量是否已经存在,如果没有存在就补充定义。

function_exists ——作用:如果给定的函数已经被定义就返回 TRUE 。
例如:var_dump(function_exists('func'));

检查函数 有何意义呢?
PHP的版本不同,函数也有增有减。为了保证我们开发的框架的兼容性,我们可以用 function_exists 检查函数是否存在,如果不存在我们可以重新定义一个。



■PHP的字符串

处理字符串是PHP的一个特色,因为PHP中处理字符串的函数非常丰富。

(C语言 中 单个字符用''括起来,字符串用""括起来。)

PHP中 字符串可以用 4 种方式表达:

①通过 单引号 表达字符串;
例如:$str = 'abcd';

②通过 双引号 表达字符串;
例如:$str = "efgh";

③通过 heredoc 语法结构 表达字符串(可以解析变量)。
例如:
$str=<<<标识符

……字符串内容……

标识符;

④通过 nowdoc 语法结构 表达字符串(不可以解析变量)。
例如:
$str=<<<'标识符'

……字符串内容……

标识符;


★表达字符串时,单引号 与 双引号 的区别:

①转义的字符不同:
单引号 能解析:\' \\
双引号 能解析:\" \n \r \t \v \f \$

②对变量的解析不同:
双引号 能解析字符串中的 变量,而 单引号 不能。

③解析速度不同:
单引号不需要考虑变量的解析,速度比双引号快。


★注意:字符串内容中有 单引号 或 双引号 的解决方法,如下:
echo "'单引号'";// 输出:'单引号'
echo '"双引号"';// 输出:"双引号"

字符串内容中既有 单引号 又有 双引号 的解决方法:
/* 通过 转义字符 解决 */
例如:echo '\'单引号\' 和 "双引号"';// 输出:'单引号' 和 "双引号"


★注意:PHP中字符串中的字符可以如下表示
$str = 'abcdefg';
echo $str[0];// 输出:a
echo $str[1];// 输出:b
即通过数组下标的形式来表示字符串中的字符。
【:)】难道 PHP 与 C 一样 字符串的处理是基于字符数组的??


■PHP常用字符串函数

常用字符串函数分类:

1.字符串长度函数;
2.查找字符位置函数;
3.字符串替换函数;
4.提取子字符函数(双字节);
5.分割、连接、反转函数;
6.去除、增加空格函数;
7.HTML代码/数据库安全处理有关函数;
8.比较字符函数;
9.字符大小写转换函数。

●字符串长度函数:

strlen()
——作用:获取字符串的字节长度(注意:是字节长度)。
例如:echo strlen('Hello中国');// 输出:11 
(在utf-8编码下,一个汉字占3个字节。)

mb_strlen()
——作用:获取字符串的字符长度(宽字符支持)。
例如:echo mb_strlen('Hello中国','UTF-8');// 输出:7

如果要考虑多语言的兼容,就需要用到mb_系列宽字符函数。

要使用mb_系列宽字符函数,需要在 php.ini 中开启。
在 php.ini 中找到:extension=php_mbstring.dll 。将前面的分号去掉 即可。


●查找字符位置函数:

strpos(字符串1,字符串2[,偏移量])
——作用:查找 字符串2 在 字符串1 中首次出现的位置。
(★注意:按字节计算,字符位置从0开始计算)
例如:
$str = '中华民族';
$sub = '华';
echo strpos($str,$sub);// 输出:3 ,因为是按字节计算的,且位置从0开始计算。

★注意:如果找不到,会返回布尔值的false。但是如果第一个字符就找到,会返回0。在这种情况下容易发生错误。所有在判断是否找到时我们习惯使用如下方法:

if(false !== strpos(字符串1,字符串2)){
//不全等于 false 就说明找到。
}else{
//否则就说明没找到。
}

已知 Hello 中有 el ,想查找 Hello 以后的部分有没有 el ,代码如下:

$str = 'Hello welcome to itcast';
$sub = 'el';
echo strpos($str,$sub,5);// 输出:7
/*
★这里的 5 是一个‘偏移量’,表示从第5个字节以后开始查找。
注意:就算是指定了偏移量,返回结果依然是从第一个字符开始计算。
*/

stripos()
——作用:strpos() 的忽略大小写版本。

strrpos(字符串1,字符串2)
——作用:查找 字符串2 在 字符串1 中最后出现的位置。


●字符串替换函数:

str_replace(字符串1,字符串2,字符串3)
——作用:把 字符串3 中的 字符串1 替换为 字符串2 并返回替换后的字符串。
(★注意:字符串3 没有被改变。)
例如:
$str = 'I fork U!';
$old = 'fork';
$new = 'f**k';
echo str_replace($old,$new,$str);// 输出:I f**k U!

str_replace 可以用数组作为参数批量替换,例如:

/* 将字符串$str中的5个英文字母替换为数字 */
$str = 'abcdefghij';
$old = array('a','c','e','g','i');
$new = array(' 1 ',' 3 ',' 5 ',' 7 ',' 9 ');
echo str_replace($old,$new,$str);
// 输出:1 b 3 d 5 f 7 h 9 j

str_ireplace()
——作用:str_replace() 的忽略大小写版本。

strtr(字符串1,字符串2,字符串3)
——作用:把 字符串1 中的 字符串2 替换为 字符串3 并返回替换后的字符串。
(★注意:字符串1 没有被改变。)
例如:
$str = 'fork U!';
$old = 'fork';
$new = 'f**k';
echo strtr($str,$old,$new);// 输出:f**k U!

strtr 也可以用数组作为参数批量替换,例如:

/* 将字符串$str中的5个英文字母替换为数字 */
$str = 'abcdefghij';
$rep = array('b'=>' 2 ','d'=>' 4 ','f'=>' 6 ','h'=>' 8 ','j'=>' 10 ');
echo strtr($str,$rep);
// 输出:a 2 c 4 e 6 g 8 i 10

substr_replace()
——作用:


●提取子字符函数:

substr(字符串,开始位置[,截取长度])
——作用:截取字符串 并返回。
注意:
①开始位置 从0开始
②开始位置 与 截取长度 可以是负数。
当 开始位置 为负数,则从倒数的位置开始截取。
当 截取长度 为负数,则代表去掉末尾的字符。

strstr(字符串1,字符串2)
——作用:从 字符串2 首次出现的位置开始截取直到结束。

stristr()
——作用:strstr() 的忽略大小写版本。

strrchr(字符串1,字符串2)
——作用:从 字符串2 最后出现的位置开始截取直到结束。


●分割、连接、反转函数:

str_split(字符串,长度)
——作用:按指定长度分割为数组 并返回。
例如:
$num = '1234567890';
print_r(str_split($num,3));
// 输出:Array ( [0] => 123 [1] => 456 [2] => 789 [3] => 0 )

split()
——作用:

explode(分界点,字符串)
——作用:将字符串分割为数组。

implode(数组)
implode(分界点,数组)
——作用:将数组组合成字符串。


●去除、增加空格函数:

trim(字符串[,指定字符])
——作用:去除字符串首尾处的空白字符(或者其他字符)。
(注意:只去除 首位 的字符。)
例如:
$username = ' Jay ';
$username = trim($username);
trim 函数不仅仅可以处理空格,还可以处理指定的字符。
例如,过滤'.':
$str = 'haha......';
echo trim($str,'.');// 输出:haha

又例如,过滤'.'和'!':
$str = 'haha.!.!.!.';
echo trim($str,'.!');// 输出:haha

再例如,过滤 a~z :
$str = 'haha.!.!.!.';
echo trim($str,'a..z');// 输出:.!.!.!.

ltrim()
——作用:删除字符串开头的空白字符(或其他字符)。

rtrim()
——作用:删除字符串末端的空白字符(或其他字符)。

chunk_split(字符串,长度,标记)
——作用:按指定长度插入标记,返回更改后的字符串。
(注意:原字符串不变。)
例如:
$str = 'abcdefghijklmnopq';
echo chunk_split($str,3,',');// 输出:abc,def,ghi,jkl,mno,pq,


●HTML代码/数据库安全处理有关函数:

addslashes()
——作用:字符转义,★防止SQL注入攻击(针对数据库的攻击)。
例如:
$str = "abc'def";
echo addslashes($str);// 输出:abc\'def
★注意:系统有一个叫“魔术引号”的功能,该功能会自动把$_GET、$_POST、$_COOKIE、$_SESSION中的数据自动转义。
所以我们在使用使用 addslashes 函数之前要判断“魔术引号”功能是否已开启,如果已开启,即不能进行手动字符转义,实现代码如下:

if(get_magic_quotes_gpc()){
echo '魔术引号已经开启,不要手动转义';
}else{
$字符串 = addslashes($字符串);
}

stripslashes()
——作用:反字符转义

get_magic_quotes_gpc()
——作用:获取当前 magic_quotes_gpc 的配置选项设置
在 PHP 5.4.O 起将始终返回 FALSE,因为这个魔术引号功能已经从 PHP 中移除了。

htmlspecialchars()
——作用:将字符串中的一些字符转换为HTML字符实体,★防止XSS攻击。
例如:
$str = '<html>';
$str = htmlspecialchars($str);
echo $str;// 输出:<html>,实际上源代码是:&lt;html&gt;gt;

htmlspecialchars_decode()
——作用:与 htmlspecialchars 相反。

html_entity_decode()
——作用:

htmlentities()
——作用:


●比较字符函数:

strcmp(字符串1,字符串2)
——作用:比较字符串。

strcasecmp()
——作用:strcmp() 的忽略大小写版本。


●字符大小写转换函数:

strtolower()
——作用:将字符串转换为小写。

strtoupper()
——作用:将字符串转换为大写。

ucfirst()
——作用:将字符串的首字符转换为大写。

ucwords()
——作用:将字符串每个单词的首字符转换为大写。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值