goodCoder

本文介绍了PHP编程中的一些基础但重要的技巧,包括unset的使用、自动加载文件函数、等号的比较、斐波那契数的计算、类型判断函数、引用操作、数组截取、寻找数组最大值的下标、类的创建、订单号生成、模拟HTTP请求方法、输出方式对比、字符串反转、数组转字符串、静态关键字应用、遍历目录以及解析URL文件后缀等。

1.unset的使用

<?php
    /*
     *unset() 函数用于销毁给定的变量。
     * 如果 unset() 一个通过引用传递的变量,则只是该变量被销毁,而在调用环境中的变量将保持调用 unset() 之前一样的值。
     */
    $test = 'aaaaaa';
    $abc = &$test;
    unset($test);
    echo $test;
    echo $abc;
    
    
    /*
     * 输出结果:aaaaaa
     *
     */

2.自动加载文件函数

 <?php

//自动加载函数:__autoload()

function __autoload($class){
    include 'lib/'.$class.'.class.php';
}
$User=new User();
/**
 * 解释:当实例化一个对象时,会在本页面查找有没有匹配的类,如果没有,会自动执行__autoload()方法,同时会把类的名称传给__autoload()这个方法,
 * 这样就可以引入与之匹配的类文件了(前提是类文件存在这个目录中)
 */

//自定义函数来加载类文件:spl_autoload_register()

function A($class){
    include 'lib/'.$class.'.class.php';
}
spl_autoload_register('A');
$User= new User();
/**
 * 解释:与上一个相同,也是先查找当前文件有没有匹配的类,然后再去执行自定义加载的函数,不同的是,
 * 如果与__autoload()同时存在的话,__autoload()不会被执行
 */

//自定义对象加载类文件:通过spl_autoload_register(array('对象','方法名称'))来实现

class A{
    public function Aauto($class){
        include 'lib/'.$class.'.class.php';
    }
}
$A=new A();
sql_autoload_register(array($A,'Aauto'));
$User= new User();

//指定静态方法加载类文件:spl_autoload_register(array('类名','静态方法名称'))来实现(两种写法)

//第一种:

class B{
    public function Aauto($class){
        include 'lib/'.$class.'.class.php';
    }
}
sql_autoload_register(array('A','Aauto'));
$User= new User();
//第二种:

class C{
    public function Aauto($class){
        include 'lib/'.$class.'.class.php';
    }
}
sql_autoload_register(array('A::Aauto'));
$User= new User();

3.等号的比较

/*

虽然 PHP 是弱类型语言,但也需要明白变量类型及它们的意义,因为我们经常需要对 PHP 变量进行比较,包含松散和严格比较。
松散比较:使用两个等号 == 比较,只比较值,不比较类型。
严格比较:用三个等号 === 比较,除了比较值,也比较类型。

*/

<?php
echo '0 == false: ';
var_dump(0 == false);
echo '0 === false: ';
var_dump(0 === false);
echo PHP_EOL;
echo '0 == null: ';
var_dump(0 == null);
echo '0 === null: ';
var_dump(0 === null);
echo PHP_EOL;
echo 'false == null: ';
var_dump(false == null);
echo 'false === null: ';
var_dump(false === null);
echo PHP_EOL;
echo '"0" == false: ';
var_dump("0" == false);
echo '"0" === false: ';
var_dump("0" === false);
echo PHP_EOL;
echo '"0" == null: ';
var_dump("0" == null);
echo '"0" === null: ';
var_dump("0" === null);
echo PHP_EOL;
echo '"" == false: ';
var_dump("" == false);
echo '"" === false: ';
var_dump("" === false);
echo PHP_EOL;
echo '"" == null: ';
var_dump("" == null);
echo '"" === null: ';
var_dump("" === null);

/*
运行结果:
   0 == false: bool(true)
0 === false: bool(false)

0 == null: bool(true)
0 === null: bool(false)

false == null: bool(true)
false === null: bool(false)

"0" == false: bool(true)
"0" === false: bool(false)

"0" == null: bool(false)
"0" === null: bool(false)

"" == false: bool(true)
"" === false: bool(false)

"" == null: bool(true)
"" === null: bool(false)
*/

4.打印斐波那锲数

<?php
/*
 * 请打印斐波那契数列10个, 1,1,2,3,5……(递归、循环)
 *
 *
 */

//循环
function F1($n)
{
    $f1 = 1;
    $f2 = 1;
    if($n<=2){
        return 1;
    }
    for ($i = 3; $i <= $n; $i++) {
       $f3=$f1+$f2;
       $f1=$f2;
       $f2=$f3;
    }
    return $f3;
}
//递归
function F2($n){
    if($n<=2){
        return 1;
    }
    return F2($n-1)+F2($n-2);
}

echo F1(10);//55
echo F2(10);//55

<?php
//矩阵相乘
function multi($arr1,$arr2){
    for($i=0;$i<2;$i++){
        for($j=0;$j<2;$j++){
            $ret[$i][$j]=0;
            for($k=0;$k<2;$k++){
                $ret[$i][$j]+=$arr1[$i][$k]*$arr2[$k][$j];
            }
        }
    }
    return $ret;
}
//快速幂
function myPow($arr,$n){
    $ret=array(0=>array(1,1),
        1=>array(1,1));
    while($n!=0){
        if($n&1){
            $ret=multi($ret,$arr);
        }
        $arr=multi($arr,$arr);
        $n>>=1;
    }
    //处理矩阵
    return $ret[0][0]+$ret[0][1];
}
$n=5;
$arr=array(0=>array(1,1),
           1=>array(1,0));
echo myPow($arr,$n-3);

5.判断类型的函数

<?php
/*
 *isset($val), empty($val),boolval($val), intval($val)
 *$val == false , $val === false, $val == null 的区别,且编写代码Demo说明。
 *
 * isset() 函数用于检测变量是否已设置并且非 NULL。如果已经使用 unset() 释放了一个变量之后,再通过 isset() 判断将返回 FALSE。
 *若使用 isset() 测试一个被设置成 NULL 的变量,将返回 FALSE。同时要注意的是 null 字符("\0")并不等同于 PHP 的 NULL 常量。
 *
 * empty() 函数用于检查一个变量是否为空。当一个变量并不存在,或者它的值等同于 FALSE,那么它会被认为不存在。如果变量不存在的话,empty()并不会产生警告。
 *empty() 5.5 版本之后支持表达式了,而不仅仅是变量。
 *
 * boolval() 函数用于获取变量的布尔值。
 *
 * intval() 函数用于获取变量的整数值。通过使用指定的进制 base 转换(默认是十进制),返回变量 var 的 integer 数值。
 * intval() 不能用于 object,否则会产生 E_NOTICE 错误并返回 1。
 *
*/
 $a;
 echo "1.".isset($a);//false
 $a=null;
 echo "2.".isset($a);//false
 $a=1;
 echo "3.".isset($a);//true
 unset($a);
 echo "4.".isset($a);//false
 $a="\0";
 echo "5.".isset($a);//true


$ivar1=0;
$istr1='Runoob';
if (empty($ivar1))
{
    echo '$ivar1' . " 为空或为 0。" . PHP_EOL;//输出
}
else
{
    echo '$ivar1' . " 不为空或不为 0。" . PHP_EOL;
}
if (empty($istr1))
{
    echo '$istr1' . " 为空或为 0。" . PHP_EOL;
}
else
{
    echo '$istr1' . " 字符串不为空或不为0。" . PHP_EOL;//输出
}

echo '0:        '.(boolval(0) ? 'true' : 'false')."\n";//false
echo '42:       '.(boolval(42) ? 'true' : 'false')."\n";//true
echo '0.0:      '.(boolval(0.0) ? 'true' : 'false')."\n";//false
echo '4.2:      '.(boolval(4.2) ? 'true' : 'false')."\n";//true
echo '"":       '.(boolval("") ? 'true' : 'false')."\n";//false
echo '"string": '.(boolval("string") ? 'true' : 'false')."\n";//true
echo '"0":      '.(boolval("0") ? 'true' : 'false')."\n";//false
echo '"1":      '.(boolval("1") ? 'true' : 'false')."\n";//true
echo '[1, 2]:   '.(boolval([1, 2]) ? 'true' : 'false')."\n";//true
echo '[]:       '.(boolval([]) ? 'true' : 'false')."\n";//false


echo intval(10.0);//10
echo intval(10);//10
echo intval(10.5);//10
echo intval(0.01);//0

6.引用的基本使用

<?php
/**
 * php传值:在函数范围内,改变变量值得大小,都不不会影响到函数外边的变量值。
 * PHP按引用:在函数范围内,对值的任何改变,在函数外部也有所体现,因为传引用传的是内存地址。
 */
function get_arr_ref(&$arr){
    unset($arr[0]);
}
function get_arr($arr){
    unset($arr[0]);
}
$arr1 = array(1, 2);
$arr2 = array(1, 2);
get_arr_ref($arr1);
get_arr($arr2);
echo count($arr1)."\n";//1
echo count($arr2)."\n";//2

7.请写一个函数,将一个长度超过10 的数组最后5项直接截取,不改变顺序变为前5项

<?php
/**
 * 请写一个函数,将一个长度超过10 的数组最后5项直接截取,不改变顺序变为前5项
 *   如{1,2,3,4,5,6,7,8,9,10}变为{6,7,8,9,10,1,2,3,4,5}。
 */

function arrsort($arr){

    $num = count($arr);
    if($num > 5){
        //array_slice() 函数返回数组中的选定部分。
        $arr_firstpart = array_slice($arr,$num-5);
        $arr_lastpart = array_slice($arr,0,($num-5));
    }else{

        return $arr;
    }
    //将两个数组合并
    $arr_new = array_merge($arr_firstpart,$arr_lastpart);
    return $arr_new;
}
 $arr=array(1,2,3,4,5,6,7,8,9,0);
 print_r(arrsort($arr));

8.求数组中最大数的下标

<?php
/**
 * 求数组中最大数的下标。
 */
function maxIndex($arr){

    $max=0;
    $count=count($arr);
    for($i=0;$i<$count;$i++){
        if($arr[$i]>$arr[$max]){
            $max=$i;
        }
    }
    return $max;
}

$arr=array(10,9,100,3,5,1);
echo maxIndex($arr);//2

9.类

<?php
/**
 * PHP实现类继承:要求有基类普通订单,包含属性订单类型(orderType)、方法打印订单信息(打印类型-单号)、Q3所述方法,
 * 子类有外卖订单,商超订单,质享订单,并覆盖基类属性、方法。要求正确使用abstract、final。
 *
 */
abstract class jOrder{

    public $orderType;//订单类型
    public $orderInfo;//打印类型


    /*
       *
       *返回字符串的毫秒数时间戳
       */
   final function get_total_millisecond()
    {
        $time = explode (" ", microtime () );
        $time = $time [1] . ($time [0] * 10000);
        $time2 = explode ( ".", $time );
        $time = $time2 [0];
        return $time;
    }
    function createOrderId(){
        srand(time());
        $orderId=get_total_millisecond();
        echo $orderId."\n";
        $orderId.=(rand()%10).(rand()%10);
        return $orderId;
    }

    function fugai(){
       echo "我是父类";
    }
    abstract function ask();


}
//外面订单
class pOrder extends jOrder{

    function fugai()
    {
        parent::fugai(); // TODO: Change the autogenerated stub
        echo "我是子类--外面订单";
    }

    function ask()
    {
        // TODO: Implement ask() method.
        echo "hello";
    }
}
//商超订单
class sOrder extends jOrder{

    function fugai()
    {
        parent::fugai(); // TODO: Change the autogenerated stub
        echo "我是子类--商超订单";
    }
    function ask()
    {
        // TODO: Implement ask() method.
        echo "hi";
    }
}
//质享订单
class zOrder extends jOrder{

    function fugai()
    {
        parent::fugai(); // TODO: Change the autogenerated stub
        echo "我是子类--质享订单";
    }
    function ask()
    {
        // TODO: Implement ask() method.
        echo "你好";
    }
}

$t1=new pOrder(1,"菜");
$t1->fugai();
$t1->ask();

10.生成订单号

<?php
/*
 * 假设订单号生成规则:10位时间戳+4位毫秒+2位随机数。已知函数isExist($orderId)可以判断订单号是否已经存在,重复可重新生成。
 * 写一个生成订单号的函数createOrderId()。
 *
 */

function createOrderId(){
    srand(time());
    $orderId=get_total_millisecond();
    echo $orderId."\n";
    $orderId.=(rand()%10).(rand()%10);
    return $orderId;
}
/*
    *
    *返回字符串的毫秒数时间戳
    */
function get_total_millisecond()
{
    $time = explode (" ", microtime () );
    $time = $time [1] . ($time [0] * 10000);
    $time2 = explode ( ".", $time );
    $time = $time2 [0];
    return $time;
}

$orderId=0;
if(empty($orderId)){
    echo createOrderId();
}else{
    echo $orderId;
}

11.模拟get()/post()方法

<?php
/**
 * fopen() 函数打开文件或者 URL,如果打开失败,本函数返回 FALSE。
 *语法:fopen(filename,mode,include_path,context)
       filename	必需。规定要打开的文件或 URL。
       mode	必需。规定要求到该文件/流的访问类型。可能的值见下表。
       include_path	可选。如果也需要在 include_path 中检索文件的话,可以将该参数设为 1 或 TRUE。
       context	可选。规定文件句柄的环境。Context 是可以修改流的行为的一套选项。
 * 参考链接:https://www.w3school.com.cn/php/func_filesystem_fopen.asp
 *
 * fread() 函数读取打开的文件。函数会在到达指定长度或读到文件末尾(EOF)时(以先到者为准),停止运行。该函数返回读取的字符串,如果失败则返回 FALSE。
 *语法:string fread ( resource $handle , int $length )
        handle	文件系统指针,是典型地由 fopen() 创建的 resource(资源)。
        length	必需。规定要读取的最大字节数。
 * 参考链接:https://www.runoob.com/php/func-filesystem-fread.html
 *
 * file_get_contents() 把整个文件读入一个字符串中。该函数是用于把文件的内容读入到一个字符串中的首选方法。如果服务器操作系统支持,还会使用内存映射技术来增强性能。
 * 语法:file_get_contents(path,include_path,context,start,max_length)
        path	必需。规定要读取的文件。
        include_path	可选。如果您还想在 include_path(在 php.ini 中)中搜索文件的话,请设置该参数为 '1'。
        context	可选。规定文件句柄的环境。context 是一套可以修改流的行为的选项。若使用 NULL,则忽略。
        start	可选。规定在文件中开始读取的位置。该参数是 PHP 5.1 中新增的。
        max_length	可选。规定读取的字节数。该参数是 PHP 5.1 中新增的。
 *
 */

//$file=fopen("https://www.runoob.com/php/func-filesystem-fread.html","r");
//$ret=fread($file,10);
//echo $ret;
//$res=file_get_contents("https://www.runoob.com/php/func-filesystem-fread.html");
//echo $res;
//fclose($file);

/**
 * http_build_query()就是将一个数组转换成url 问号?后面的参数字符串,并且会自动进行urlencode处理。
 * 参考链接:http://www.nowamagic.net/librarys/veda/detail/2585
 *
 *stream_context_create() 是用来创建打开文件的上下文件选项的,比如用POST访问等
 */

//post方法
$data = array(
    'foo'=>'bar',
    'baz'=>'boom',
    'site'=>'www.nowamagic.net',
    'name'=>'nowa magic');

$data = http_build_query($data);//foo=bar&baz=boom&site=www.nowamagic.net&name=nowa+magic
$options = array(
    'http' => array(
        'method' => 'POST',
        'header' => 'Content-type:application/x-www-form-urlencoded',//post向服务器提交数据的一种方式
        'content' => $data,//提交的内容
        'timeout' => 60 * 60 // 超时时间(单位:s)
    )
);

$url = "http://www.nowamagic.net/librarys/veda/detail/2585";
http://www.nowamagic.net/librarys/veda/detail/2585
$context = stream_context_create($options);
$result = file_get_contents($url, false, $context);
echo $result;

//get方法
$url = "http://www.nowamagic.net/librarys/veda/detail/2585";
$result=file_get_contents($url);
echo $result;

12.三种输出方法的比较

<?php

//echo输出练习
echo "<h2>PHP 很有趣!</h2>";
echo "Hello world!<br>";
echo "我要学 PHP!<br>";
echo "这是一个", "字符串,", "使用了", "多个", "参数。";

//echo输出变量练习
$txt1="学习 PHP";
$txt2="RUNOOB.COM";
$cars=array("Volvo","BMW","Toyota");
echo $txt1;
echo "<br>";
echo "在 $txt2 学习 PHP ";
echo "<br>";
echo "我车的品牌是 {$cars[0]}";

//print输出练习
print "<h2>PHP 很有趣!</h2>";
print "Hello world!<br>";
print "我要学习 PHP!";

//print输出变量练习
$txt1="学习 PHP";
$txt2="RUNOOB.COM";
$cars=array("Volvo","BMW","Toyota");

print $txt1;
print "<br>";
print "在 $txt2 学习 PHP ";
print "<br>";
print "我车的品牌是 {$cars[0]}<br>";

//print_r输出
$a = array ('a' => 'apple', 'b' => 'banana', 'c' => array ('x','y','z'));
print_r ($a);
$b = array ('m' => 'monkey', 'foo' => 'bar', 'x' => array ('x', 'y', 'z'));
$results = print_r ($b, true); // $results 包含了 print_r 的输出结果

13.字符串反转

<?php
/**
 * 请自己写一个函数,实现字符串的反转。
 *
 */

/*
 * substr(string,start,length);函数返回字符串的一部分.
 *        string	必需。规定要返回其中一部分的字符串。
 *        start	    必需。规定在字符串的何处开始。
 *                  正数 - 在字符串的指定位置开始
 *                  负数 - 在从字符串结尾开始的指定位置开始
 *                  0 - 在字符串中的第一个字符处开始
 *       length	   可选。规定被返回字符串的长度。默认是直到字符串的结尾。
 *                 正数 - 从 start 参数所在的位置返回的长度
 *                 负数 - 从字符串末端返回的长度
 *
 *
 * mb_substr — 获取部分字符串
 *      作用和substr一致,不同的是多了一个字符编码的参数
 */

//方法一:递归实现
function reverse1($str)
{
    if (strlen($str) <= 1) return $str;
    $ret = '';
    $ret .= substr($str,-1).reverse1(substr($str,0,strlen($str)-1));
    return $ret;
}

//方法二
function reverse2($str){
    $sz=strlen($str);
    if($sz<=1)return $str;
    $ret="";
    for($i=$sz-1;$i>=0;$i--){
        $ret=$ret.$str[$i];
    }
    return $ret;
}

//前两个方法碰到汉字会乱码
//方法三
function reverse3($str,$encoding='utf-8'){
    $ret = '';
    $sz = mb_strlen($str);
    for($i=$sz-1; $i>=0; $i--){
        $ret .= mb_substr($str,$i,1,$encoding);
    }
    return $ret;
}

$str="ni haoya";
$str1="你好";
echo reverse1($str);
echo reverse3($str1);

/*
 * 运行结果
 * ayoah in
 * 好你
 */

14. 将数组用一行拼装成一个字符串

<?php
/**
 * 将下面的数组用一行拼装成一个字符串 i am qa ! day day up!
 *
 */
$arr = array(
    'I', 'AM', 'QA!', 'DAY', 'DAY', 'UP!'
);
$count=count($arr);
$str="";
for($i=0;$i<$count;$i++){
    $str.=$arr[$i];
}
echo $str;

15.static 关键字用法

<?php

/*
 * static修饰静态变量,在函数中使用时,会改变变量的生命周期,但是不会改变变量的作用域
 */
$count = 5;
function get_count(){
    static $count = 0;
    return $count++;
}
echo $count;//5
++$count;
echo get_count();//0
echo get_count();//1
echo get_count();//2

16.遍历目录

<?php
/**
 * 请写一个函数遍历目录下的所有文件和文件夹。
 */
$filePath  = array();//文件路径数组
function traverse($path = '.') {
    global $filePath;//得到外部定义的数组
    $current_dir = opendir($path);    //opendir()返回一个目录句柄,失败返回false
    while(($file = readdir($current_dir)) !== false) {    //readdir()返回打开目录句柄中的一个条目,成功则返回文件名 或者在失败时返回 FALSE
        $sub_dir = $path . DIRECTORY_SEPARATOR . $file;    //构建子目录路径
        if($file == '.' || $file == '..') {
            continue;
        }else if(is_dir($sub_dir)) {    //如果是目录,进行递归
            echo 'Directory ' . $file . ':';  //如果是文件夹,输出文件夹名称
            traverse($sub_dir); //嵌套遍历子文件夹
        }else{    //如果是文件,直接输出路径和文件名
            echo 'File in Directory ' . $path . '/' . $file .'<br/>';
            $filePath[$path . '/' . $file] = $path . '/' . $file;//把文件路径赋值给数组
        }
    }
    return $filePath;
}
$array = traverse("E:\untitled1");
print_r($array);

17.获取url中文件后缀

<?php
/*
 * 请写一个函数,尽可能高效的,从一个标准 url里取出文件的扩展名。
 *
 * 一个标准url包含什么?
 * 答:模式(或称协议)、服务器名称(或IP地址)、路径和文件名,如:http://www.baidu.com/abc/de/fg.php?id=1
 *
 *  在php预定义函数中有一个叫做"pathinfo()"的函数,以数组的形式返回关于文件路径的信息。
 *  返回的数组元素如下:
 *  [dirname]: 目录路径
 *  [basename]: 文件名
 *  [extension]: 文件后缀名
 *  [filename]: 不包含后缀的文件名
 *  pathinfo($url_path,[option_info])
 *           $url_path: URL的路径(字符串形式)
 *           [option_info]:其他可选参数(PATHINFO_DIRNAME,PATHINFO_BASENAME,PATHINFO_EXTENSION)
 */
     $url_path="http://www.baidu.com/abc/de/fg.php?id=1";
    //方法一
     $result=pathinfo($url_path,PATHINFO_EXTENSION);
     $result=explode('?',$result);
     echo $result[0]."\n";//php

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值