PHP之谈(三)——细节的区别

  本文章主要分析的是文件包含、输出语句和排序函数的区别。原本打算分成三篇文章,可是感觉分开的话每篇文章有很少,于是就整合到一块了。

require、include、require_once和include_once的区别

  这四条语句都能包含文件,其实应该说是两条语句的区别。

  1. 对include()来说,在include()执行时文件每次都要进行读取和评估;而对于require()来说,文件只处理一次(实际上,文件内容替换了require()语句)。这就意味着如果有包含这些指令之一的代码和可能执行多次的代码,则使用require()效率比较高。

  2. require语句的原理是,在PHP代码中如果发现require语句,且文件路径正确,则首先将文件中的代码引进来,然后才开始运行,因此他不知道for循环;而include语句,是在什么时候执行到了才开始执行include语句。举个例子。

if($some){
  include ("something.php");
}
if($some){
 require ("something.php");
}

  上面的两个if语句中,第一个if语句,只有在$some为真时才引进something.php文件;而第二个if语句,由于是先执行require语句才运行整个代码,因此他不知道这里有个if语句,只是把$something.php中的代码引进来了而已,所以不管$some是否为真都会引进something.php

  还有一个例子,

$i=1;
while($<=3;){
  require ("something.$i.php");
  $i++;
}

  我们的本意是想引进三个文件,分别是something.1.php, something.2.php, something.3.php,可是运行后我们却发现,我们将something.1.php文件中的代码引进了三次。如果我们想引入这三个文件,需要将require换成include。

  3. 在引入文件发生错误时(比如该文件不存在),这两条语句进行的操作也不一样。include语句引入文件错误时,提示发生错误,然后接着往下执行;而require语句引入文件发生错误时,立即停止执行下面的代码。

  4. require的使用方法:这个函数通常放在 PHP 程序的最前面,PHP 程序在执行前,就会先读入 require 所指定引入的文件,使它变成 PHP 程序网页的一部份。常用的函数,亦可以这个方法将它引入网页中。include使用方法:这个函数一般是放在流程控制的处理部分中。PHP 程序网页在读到 include 的文件时,才将它读进来。这种方式,可以把程序执行时的流程简单化

  5. 终于讲到了require_once和include_once,这两个语句的用法分别于require和include相同,只不过,这两个语句均是为了在重复包含、多重包含中防止出现多次引用同一个文件,防止出现函数或者变量重复定义的错误。

 输出语句(函数)之间的区别

  这里主要讲到的主要有echo, print, print_r, printf, sprintf, var_dump。

  1. echo

  void echo(string $arg1[, string $...]);

  echo不是一个函数(它是一个语言结构),没有返回值,因此你不一定要使用小括号来指明参数,单引号,双引号都可以。echo()(不像其他语言构造)不表现得像一个函数,所以不能总是使用一个函数的上下文。另外,如果你想给echo()传递多个参数,那么就不能使用小括号。

  上面的这是官方翻译的,看了好长时间没看懂。不过看一些例子应该就会明白的。

  echo ("xumengxuan");

  echo  "xumengxuan";//这两条语句都能输出xumengxuan。加不加括号都一样

  echo ("xumengxuan", "cnblogs");

  echo "xumengxuan", "cnblogs";//这两条语句就不一样了。当输出多个字符串的时候是不能加括号的,下面的正确

  echo "xu

  meng

  xuan";//这样也是可以的,不管怎样换行,只要能连成一条完整的字符串就能够输出

  echo()也有一个快捷用法,示例如下。但是你必须在php.ini里面打开short_poen_tag

  <?=$string ?>

  2. print()

  int print(string $args);

  print()实际上不是一个函数(它是一个语言结构),因此你可以不必使用圆括号括起他的参数列表。

  用通俗的话说,print ("xumengxuan")与print "xumengxuan"的结果是一样的,没有区别的。而且print()是有返回值的,永远是1.

  3. print_r()

  bool print_r(mixed $expression [, bool $return]);

  print_r()显示关于一个变量的易于理解的信息。如果给出的是string、intege或float,将打印变量值本身。如果给出的array,将会按照一定格式显示键值对。object与数组类似。

  同时,print_r()将吧数组的指针移到最后边。使用reset()可让指针回到开始处。

 1 <?php
 2 
 3    $name = "xumengxuan\r\n";
 4 
 5    print_r($name);
 6 
 7      $a = array("a"=>"apple", "b"=>"banana", "c"=>array('x', 'y', 'z'));
 8 
 9      print_r($a);
10     
11 ?>

 

  上面的代码将输出:

  xumengxuan

  Array(

    [a]=>apple;

    [b]=>banana;

    [c]=>Array(

      [0]=>x;

      [1]=>y;

      [2]=>z;

    )

 

  )

  当然,我们还发现print_r()还有一个可选参数。若$return为true,则不进行输出而是将变量返回,否则进行输出。当然如果不写$return则认为是输出变量。

  $name = print_r("xumengxuan", true);//则现在$name的值为"xumengxuan"

  4. printf

  int printf(string $format [, mixed $args [, $mixed $...]]);//依据format格式参数产生输出。

  返回值为输出字符串的长度。

  用法和C语言中的printf一样,不过返回值不同而已。

  $f = 172.562;

  $s = "xumengxuan";

  printf("%.1f %s", $f, $s);

  则输出:172.6 xumengxuan

  返回值为16(printf()只是计算输出字符串的长度,因此把上面的输出认为成一个完整的字符串,包括空格和小数点,共有16个字符,即字符串的长度为16,因此返回16)。

  5. sprintf

  string sprintf(string $format [, mixed $args [, $mixed $...]]);//依据format格式参数进行返回。

  也就是说,sprintf()与printf()用法完全一样,只不过printf()是用来输出知道界面上的,返回值为输出字符串的长度;而sprintf()是将参数返回到变量中。

  6. var_dump

  void var_dump(mixed $expression [, mixed $expression [, $...]]);

  此函数显示关于一个或多个表达式的结构信息,包括表达式的类型与值。数组将递归展开值,通过缩进显示其结构。

  举例:

  $a = 12.36;

  $b = true;

  $c = array(1, 2, array("a", "b", "c"));

  var_dump($a, $b, $c);

  将输出:

  float(12.36)

  bool(true);

  array(3){

    [0]=>int(1)

    [1]=>int(2)

    [2]=>array(3){

      [0]=>string(1)"a"

      [1]=>string(1)"b"

      [2]=>string(2)"c"

    }

  }

排序函数之间的区别

  主要的排序函数有sort(), asort(), rsort(), ksort(), arsort(), krsort().

  这几个排序函数的主要区别就是排序的参照和原来的键值是否依然保持不变。

  1. sort()

  函数原型:bool sort(array &$arr [, int sort_flags]) ;

  本函数对数组进行排序。当本函数结束时数组单元将被从最低到最高重新排列。成功时返回TRUE,失败时返回FALSE。

  注意:次函数为array中的元素赋予新的键名。这将删除原有的键名,而不仅仅将键名重新排序。

  什么意思呢,很简单。举个例子吧。

  $color = array("red", "yellow", "blue");

  现在print_r($color),输出的是:Array([0]=>red [1]=>yellow [2]=>blue);

  现在排序sort($color);然后输出print_r($color);现在输出的是:Array([0]=>blue [1]=>red [2]=>yellow);

  键值对已经发生了变化。

  2. rsort()

  函数原型:bool rsort(array &$array [, int $sort_flags]);

  本函数与sort()的用法相似,只不过是对数组进行逆向排序。

  3. asort()

  函数原型:bool asort(array &$array [, int $sort_flags]);

  本函数对数组进行排序,数组的索引保持和单元的关联。主要用于对那些单元顺序很重要的结合数组进行排序。成功时返回TRUE,失败时返回FALSE。

  这是跟sort()排序函数最大的区别。还是那个例子,在使用sort()排序之前$color[0]="red",

排序之后$color[0]="blue"。可是使用asort()排序。我们用print_r($color)输出竟然是这样的:

  Array([2]=>blue [1]=>red [0]=>yellow);

  也就是说,asort()函数也是按照“值”为依据进行排序的,可是并没有打乱“键”与“值”之间的对应关系,echo $color[0],输出的依然是"blue".

  疑问:貌似用这个方法不能单独取出排序后的值。

  4. arsort()

  函数原型:bool arsort(array &$array [, int $sort_flags]);

  本函数与asort()的用法相似,只不过是对数组进行逆向排序。

  5. ksort()

  函数原型:bool ksort(array &$array [, int $sort_flags]);

  对数组按照键名排序,保留键名到数据的关联。本函数主要用于关联数组。成功时返回TRUE,失败时返回FALSE。

  这个函数与上面所有的函数的排序依据不同,这个函数是按照“键”的值来进行排序的,而不是按“值”的值来排序。因此,这个函数也一般用在关联数组上,对于$color这样的数组采用本函数是没有意义的,因为会保持不变。

  举个例子。

  $local = array("d"=>"east", "b"=>"west", "a"=>"north", "c"=>"south");

  ksort($local);

  print_r($local);

  输出的结果是:Array("a"=>north "b"=>west "c"=>south "d"=>east);

  6. krsort()

  函数原型:bool krsort(array &$array [, int $sort_flags]);

  本函数与ksort()的用法相似,只不过是进行逆向排序。

原文地址:https://www.cnblogs.com/xumengxuan/p/2741342.html