PHP 函数掌握总结(一)

308 查看

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框架,接触过小项目一二三吧,懂得不是很对,因为不知道的太多。由于本人水平有限,所有错误恳请各位纠正。