PHP 函数掌握总结

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,362评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,330评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,247评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,560评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,580评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,569评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,929评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,587评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,840评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,596评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,678评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,366评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,945评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,929评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,165评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,271评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,403评论 2 342

推荐阅读更多精彩内容

  • 一、php可以做什么 php是一种可以在服务器端运行的编程语言,可以运行在Web服务器端。 php是一门后台编程语...
    空谷悠阅读 3,086评论 4 97
  • 第5章 引用类型(返回首页) 本章内容 使用对象 创建并操作数组 理解基本的JavaScript类型 使用基本类型...
    大学一百阅读 3,204评论 0 4
  • 这个十一月即将结束,很多人即将离开。 美胖即将离开,现在的我好像也变的不是那么慌张了,也许本身的我就习惯了悲欢离合...
    Ermao阅读 230评论 1 1
  • 初雪已覆城,夜风仍积威。 用来形容今天的帝都,恰如其分。 出去溜达了3个小时,不太想承认自己迷路了,坐车坐反了,然...
    Yetta姑娘阅读 172评论 0 1
  • 表单上传 html: js: php:
    雨中追燕阅读 140评论 0 0