PHP自定义函数
PHP是弱类型语言,相对其他语言来说比较随意和灵活,函数名对大小写不敏感。
函数名和 PHP 中的其它标识符命名规则相同。有效的函数名以字母或下划线打头,后面跟字母,数字或下划线。可以用正则表达式表示为:[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*。
Example #1 展示函数用途的伪代码
<?php
function aierui()
{
# 业务逻辑
}
?>
Example #2 有条件的函数
当一个函数是有条件被定义时,必须在调用函数之前定义。
<?php
$flag = true;
star();
/* 不能在此处调用star()函数, 因为它还不存在,但可以调用bar()函数。*/
if($flag){
function star(){
echo "star--function";
}
}
//判断$flag后为真就可以调用star()函数
function bar()
{
return "bar";
}
Example #3 函数中的函数
function aierui($str)
{
$a = 'some';
echo $str;
function add($str1)
{
echo $a.$str1;
}
}
//不能够直接先调用aierui()函数内的add函数,
// 报错 Fatal error: Call to undefined function add()
//
aierui('aierui');
add("like");
//这种情况并且拿不到外函数的变量 提示Notice: Undefined variable: str
小例:一般就是在自定义中调用PHP内置的函数尤其常见,当然也可以在函数内自定调用,个人不建议,还是在函数外定义去调用吧,
function convertDate($date,$locale,$length)
{
$monthNames = array(
"en" => array(
"full" => array(1=>'January','February','March','April','May',
'June','July','August','September','October','November','December'),
"short" => array(1=>'Jan','Feb','Mar','Apr','May','Jun',
'Jul','Aug','Sep','Oct','Nov','Dec')
),
"es" => array(
"full" => array(1=>'Enero','Febrero','Marzo','Abril','Mayo',
'Junio','Julio','Agosto','Septiembre','Octubre','Noviembre','Deciembre'),
"short" => array(1=>'Ene','Feb','Mar','Abr','May','Jun',
'Jul','Ago','Sep','Oct','Nov','Dec')
),
);
$exploded = explode("-",$date);
$year = $exploded[0];
$month = $exploded[1];
$day = $exploded[2];
$month = $monthNames[$locale][$length][$month];
$date = $day . " " . $month . ", " . $year;
return $date;
}
echo convertDate("2016-8-23","en","full");//23 August, 2016
Example #4 递归函数
递归函数简单的理解就是自己调用自己,但是要避免递归函数/方法调用超过 100-200 层,因为可能会使堆栈崩溃从而使当前脚本终止。 无限递归可视为编程错误。
function recursion($a)
{
if ($a < 20) {
echo "$a\n";
recursion($a + 1);
}
}
recursion(12);
函数的参数
Example #1 向函数传递数组
通过参数列表可以传递信息到函数,即以逗号作为分隔符的表达式列表。参数是从左向右求值的。
function takes_array($input)
{
echo "$input[0] + $input[1] = ", $input[0]+$input[1];
}
通过引用传递参数
默认情况下,函数参数通过值传递(因而即使在函数内部改变参数的值,它并不会改变函数外部的值)。如果希望允许函数修改它的参数值,必须通过引用传递参数。
如果想要函数的一个参数总是通过引用传递,可以在函数定义中该参数的前面加上符号 &:
Example #1 用引用传递函数参数
function add_some_extra(&$string)
{
$string .= 'and something extra.';
}
$str = 'This is a string, ';
add_some_extra($str);
echo $str; // 'This is a string, and something extra.'
默认参数的值
这个有点像 C++ 风格的标量参数默认值,如下所示:
function makecoffee($type = "cappuccino")
{
return "Making a cup of $type.\n";
}
echo makecoffee();//Making a cup of cappuccino.
echo makecoffee(null);//Making a cup of .
echo makecoffee("espresso");//Making a cup of espresso.
默认值必须是常量表达式,不能是诸如变量,类成员,或者函数调用等。
注意当使用默认参数时,任何默认参数必须放在任何非默认参数的右侧;否则,函数将不会按照预期的情况工作。
function makeyogurt($type = "acidophilus", $flavour) (×)
function makeyogurt($flavour, $type = "acidophilus") (√)
PHP内置函数
这些内置函数是我在项目中用到的比较多
检测变量
is_string()、is_array()、is_object()、is_float()、
is_null()、isset、empty
我在这半年多的时间里上面用到最多是后面三个,看上去不同。但却又相同之处。
empty
如果 变量 是非空或非零的值,则 empty() 返回 FALSE。换句话说,""、0、"0"、NULL、FALSE、array()、var $var、未定义; 以及没有任何属性的对象都将被认为是空的,如果 var 为空,则返回 TRUE。
isset
如果 变量 存在(非NULL)则返回 TRUE,否则返回 FALSE(包括未定义)。变量值设置为:null,返回也是false;unset一个变量后,变量被取消了。注意,isset对于NULL值变量,特殊处理。
is_null
检测传入值【值,变量,表达式】是否是null,只有一个变量定义了,且它的值是null,它才返回TRUE . 其它都返回 FALSE 【未定义变量传入后会出错!】
过滤掉的范围从大到小empty>isset>is_null
也有人说isset是语言结构、is_null是函数。鸟哥分析isset与is_null区别
处理string用的内置函数
最简单直接输出字符串
echo() 输出字符串
print()输出一个或多个字符串。
printf() 输出格式化的字符串。
[strlen()] 返回字符串的长度。
[substr()] 返回字符串的一部分。
[strtolower()]把字符串转换为小写字母。
[strtoupper()]把字符串转换为大写字母。
[strstr()]查找字符串在另一字符串中的第一次出现(对大小写敏感)。
[str_replace()]替换字符串中的一些字符(对大小写敏感)。
[explode()]把字符串打散为数组。
[implode()]返回由数组元素组合成的字符串。[join()]和这个函数一样
mb_strpos — 查找字符串在另一个字符串中首次出现的位置
[strcmp()]比较两个字符串(对大小写敏感)看到过别人用这函数比较两次输入的密码
处理array用的内置函数
我之前写过关于处理数组部分,这里附上链接就行吧
学习PHP的数组总结【经验】
处理数组,在项目中我的特别有感触。由于是野路子出身,很多东西不清楚。
在这里留一些问题吧
- 二维数组的遍历、遍历时转换数据格式等 如三目运算符对数据状态的判断、时间戳转换成具体的时间格式。
- 查询结果某个字段是json格式怎么方便在TP view页面上拿到
- 修改复选框后从数据库中删除没用的数据
- 存在父级id时,怎么将父级和child一块儿重新排序 输出
- 字符串的拼接特别是和sql公用的时
- 一个表单提交过来是一个二维数组(假设里面array为1,外面为2),将array1存到另一个表中,甚至是三位 四维数组的时候怎么处理,三维可以尝试使用TP 批量添加方法addAll()
贴一段代码
$data['product_id'] = $this->shop_activity_product->where(" activity_id = " .$id)->field("product_id")->select();
foreach ($data['product_id'] as $value) {
$value = implode(",", $value);
$temp[] = $value;
}
$t = "";
foreach ($temp as $value) {
$t .="".$value."".",";
}
$data['product_id'] = substr($t, 0);
if($data['gift'] == 1 && $data['gift_text'] != ''){ //搭赠产品及规则信息
$gift_text = json_decode($data['gift_text']);
$data['gift_text'] = array();
foreach($gift_text as $k=>$v){
$row = $this->shop_product
->alias("sp")
->join("shop_goods as sg ON sg.id = sp.goods_id")
->field("sg.title,sp.*")
->where("sp.id = %d",$v->product_id)
->find();
$spec = json_decode($row['spec']);
$row['spec'] = '';
if(!empty($spec)){
foreach($spec as $k1=>$v1){
$row['spec'] .= $v1->sku_text.':'.$v1->text.',';
}
}
$row['spec'] = rtrim($row['spec'],',');
$data['gift_text']['product_id'] = $v->product_id;
$data['gift_text']['product_name'] = $row['title'];
$data['gift_text']['product_spec'] = $row['spec'];
$data['gift_text']['product_num'] = $v->num;
$data['gift_text']['jine'] = $v->jine;
$data['gift_text']['shuliang'] = $v->shuliang;
}
}
处理files、Date、Directory、GD库、等用的内置函数
我本人用的不是很多,今天在这里暂时没有资格说太多,需要话建议看看PHP官方手册吧,操作数据库的内置函数在这里也不说啦。
我还会用到获得唯一的字符串用来做图片文件名等
//确保文件名唯一,防止重名产生覆盖
- $uniName = md5(uniqid(microtime(true),true)).'.'.$ext;
- $uniName = uniqid(rand(0,time())).'.'.$ext;
private function createCheckCode(){
//这里主要产生随机码,从2开始是为了区分1和l
$code="23456789abcdefghijkmnpqrstuvwxyzABCDEFGHIJKMNPQRSTUVWXYZ";
$string='';
for($i=0; $i < $this->codeNum; $i++){
$char=$code{rand(0, strlen($code)-1)};
$string.=$char;
}
return $string;
}
获取PHP所有内置函数
echo "<pre>";
print_r(get_defined_functions());
以上内容都很死板和简单,在接下来我会在这里继续探讨PHP魔力。
注明
本人较熟悉TP框架,接触过小项目一二三吧,懂得不是很对,因为不知道的太多。由于本人水平有限,所有错误恳请各位纠正。