PHP基础深入

162 篇文章 0 订阅
114 篇文章 0 订阅

今天才发觉,自己对PHP的一些基础的东西还是不是很熟悉啊。哎,抛开自己的PHP技术有多了解的不说,现在低下头来,认真的把这些知识都好好的熟悉了解下:

1.PHP 支持8种基本的数据类型。

四种标量类型:

两种复合类型:

最后是两种特殊类型:

为了确保代码的易读性,本手册还介绍了一些伪类型

以及伪变量 $....

2.如果想查看某个表达式的值和类型,用var_dump()如果只是想得到一个易读懂的类型的表达方式用于调试,用gettype()。要查看某个类型,不要gettype(),而用is_type 函数。怎么用is_type函数呢:echo is_string($a);这个例子告诉你怎么用了。

3.可能还会读到一些关于“双精度(double)”类型的参考。实际上 double 和 float 是相同的,由于一些历史的原因,这两个名称同时存在。

4.如果要将一个变量强制转换为某类型,可以对其使用强制转换或者settype() 函数。

怎么用settype(): $a = 12.324; settype($a,'integer');或者$a = 12.324; settype($a,'int);


5.当转换为 boolean 时,以下值被认为是FALSE

所有其它值都被认为是 TRUE(包括任何资源)。

Warning

-1 和其它非零值(不论正负)一样,被认为是 TRUE

6.floor() 函数向下舍入为最接近的整数。round() 函数对浮点数进行四舍五入。

  
  

例子

<?php
echo(round(0.60));
echo(round(0.50));
echo(round(0.49));
echo(round(-4.40));
echo(round(-4.60));
?>

输出:

1
1
0
-4
-5

例子

在本例中,我们将对不同的数应用 floor() 函数:

<?php
echo(floor(0.60));
echo(floor(0.40));
echo(floor(5));
echo(floor(5.1));
echo(floor(-5.1));
echo(floor(-5.9))
?>

输出:

0
0
5
5
-6
-6

7.决不要将未知的分数强制转换为 integer,这样有时会导致不可预料的结果。 

8.dechex() 函数把十进制转换为十六进制。

9.关于浮点数精度的警告

显然简单的十进制分数如同 0.1 0.7 不能在不丢失一点点精度的情况下转换为内部二进制的格式。这就会造成混乱的结果:例如,floor((0.1+0.7)*10) 通常会返回7 而不是预期中的8,因为该结果内部的表示其实是类似7.9。所以永远不要相信浮点数结果精确到了最后一位,也永远不要比较两个浮点数是否相等。如果确实需要更高的精度,应该使用任意精度数学函数或者gmp 函数

10.不像双引号heredoc语法结构,在单引号字符串中的变量 和特殊含义的字符将 不会 被替换。 如果字符串是包围在双引号(")中, PHP将对一些特殊的字符进行解析:

11.第三种定义字符串的方法是用heredoc句法结构:<<<。在该提示符后面,要定义个标识符,然后是一个新行。接下来是字符串 本身,最后要用前面定义的标识符作为结束标志。

结束时所引用的标识符必须在一行的开始位置, 而且,标识符的命名也要像其它标签一样遵守PHP的规则:只能包含字母、数字和下划线,并且不能用数字和下划线作为开头。

12.

就象heredoc结构类似于双引号字符串,Nowdoc结构是类似于单引号字符串的。Nowdoc结构很象heredoc结构,但是 nowdoc不进行解析操作 。 这种结构很适合用在不需要进行转义的PHP代码和其它大段文本。与SGML的<![CDATA[ ]]> 结构是用来声明大段的不用解析的文本类似,nowdoc结构也有相同的特征。

一个nowdoc结构也用和heredocs结构一样的标记 <<<, 但是跟在后面的标志符要用单引号括起来,就像<<<'EOT'这样。heredocs结构的所有规则也同样适用于nowdoc结构,尤其是结束标志符的规则。 Nowdoc结构是在PHP 5.3.0中加入的。

13.数组:

key 可以是 integer 或者 string。如果key是一个integer 的标准表示,则被解释为整数(例如"8" 将被解释为8,而"08" 将被解释为"08")。key 中的浮点数被取整为integer。在 PHP 中索引数组与关联数组 是相同的,它们都可以同时包含整型字符串 的下标。

值可以是任意的 PHP 类型。

如果对给出的值没有指定键名,则取当前最大的整数索引值,而新的键名将是该值加一。如果指定的键名已经有了值,则该值会被覆盖。

Warning

自 PHP 4.3.0 起,上述的索引生成方法改变了。如今如果给一个当前最大键名是负值的数组添加一个新值,则新生成的的索引将为零(0)。以前新生成的索引为当前最大索引加一,和正值的索引相同。

如果给出方括号但没有指定键名,则取当前最大整数索引值,新的键名将是该值 + 1。如果当前还没有整数索引,则键名将为 0。如果指定的键名已经有值了,该值将被覆盖。

注意这里所使用的最大整数键名不一定当前就在数组中。它只要在上次数组重新生成索引后曾经存在过就行了。

为什么 $foo[bar] 错了?

应该始终在用字符串表示的数组索引上加上引号。例如用 $foo['bar'] 而不是 $foo[bar]。但是为什么 $foo[bar] 错了呢?可能在老的脚本中见过如下语法:

<?php
$foo
[bar] = 'enemy';
echo 
$foo[bar];
// etc
?>

这样是错的,但可以正常运行。那么为什么错了呢?原因是此代码中有一个未定义的常量(bar)而不是字符串('bar'-注意引号),而 PHP 可能会在以后定义此常量,不幸的是你的代码中有同样的名字。它能运行,是因为 PHP 自动将裸字符串(没有引号的字符串且不对应于任何已知符号)转换成一个其值为该裸字符串的正常字符串。例如,如果没有常量定义为bar,PHP 将把它替代为'bar' 并使用之。

Note: 这并不意味着总是给键名加上引号。用不着给键名为常量变量的加上引号,否则会使 PHP 不能解析它们。重申一次,在双引号字符串中,不给索引加上引号是合法的因此"$foo[bar]"是合法的(“合法”的原文为valid。在实际测试中,这么做确实可以访问数组的该元素,但是会报一个常量未定义的notice。无论如何,强烈建议不要使用$foo[bar]这样的写法,而要使用$foo['bar']来访问数组中元素。--


14.可以将变量放置在双引号中的方式来代替将变量转换成 字符串.

15.

glob() 函数返回匹配指定模式的文件名或目录。

该函数返回一个包含有匹配文件 / 目录的数组。如果出错返回 false。

语法

glob(pattern,flags)

16.试运行下面的代码:看看输出什么东西。体会这两个魔法常量的效果。

class trick

{
      function doit()
      {
                echo __FUNCTION__;
      }
      function doitagain()
      {
                echo __METHOD__;
      }
}
$obj=new trick();
$obj->doit();
output will be ----  doit
$obj->doitagain();

17.接着运行下面的代码呢:

class A
{
    function showclass()
    {
        echo __CLASS__;
    }
}

class B extends A
{
}

$a = new A();
$b = new B();

$a->showclass();
$b->showclass();
A::showclass();
B::showclass();

18.instanceof 用于确定一个 PHP 变量是否属于某一类class 的实例.

例如:

<?php
class MyClass
{
}

class 
NotMyClass
{
}
$a = new MyClass;

var_dump($a instanceof MyClass);
var_dump($a instanceof NotMyClass);
?>

以上例程会输出:

bool(true)
bool(false)
再来一个例子:

   
   
<?php interface MyInterface { } class MyClass implements MyInterface { } $a = new MyClass; $b = new MyClass; $c 'MyClass'; $d 'NotMyClass'; var_dump($a instanceof $b); // $b is an object of class MyClass var_dump($a instanceof $c); // $c is a string 'MyClass' var_dump($a instanceof $d); // $d is a string 'NotMyClass' ?>

以上例程会输出:

bool(true)
bool(true)
bool(false)

instanceof
运算符是 PHP 5 引进的。在此之前用 is_a(),但是 is_a() 已经过时了,最好用 instanceof

19.

break

break 结束当前 forforeachwhiledo-while 或者switch 结构的执行。

break 可以接受一个可选的数字参数来决定跳出几重循环。

<?php
$arr 
= array('one''two''three''four''stop''five');
while (list (, 
$val) = each($arr)) {
    if (
$val == 'stop') {
        break;    
/* You could also write 'break 1;' here. */
    
}
    echo 
"$val<br />\n";
}

/* 使用可选参数 */

$i 0;
while (++
$i) {
    switch (
$i) {
    case 
5:
        echo 
"At 5<br />\n";
        break 
1;  /* 只退出 switch. */
    
case 10:
        echo 
"At 10; quitting<br />\n";
        break 
2;  /* 退出 switch 和 while 循环 */
    
default:
        break;
    }
}
?>

20.

continue

continue 在循环结构用用来跳过本次循环中剩余的代码并在条件求值为真时开始执行下一次循环。

Note: 注意在 PHP 中 switch 语句被认为是可以使用 continue 的一种循环结构。

continue 接受一个可选的数字参数来决定跳过几重循环到循环结尾。

<?php
while (list ($key$value) = each($arr)) {
    if (!(
$key 2)) { // skip odd members
        
continue;
    }
    
do_something_odd($value);
}

$i 0;
while (
$i++ < 5) {
    echo 
"Outer<br />\n";
    while (
1) {
        echo 
"&nbsp;&nbsp;Middle<br />\n";
        while (
1) {
            echo 
"&nbsp;&nbsp;Inner<br />\n";
            continue 
3;
        }
        echo 
"This never gets output.<br />\n";
    }
    echo 
"Neither does this.<br />\n";
}
?>

省略 continue 后面的分号会导致混淆。以下例子示意了不应该这样做。

<?php
  
for ($i 0$i 5; ++$i) {
      if (
$i == 2)
          continue
      print 
"$i\n";
  }
?>

希望得到的结果是:

0
1
3
4

可实际的输出是:

2

21.return的用法:

return

如果在一个函数中调用 return() 语句,将立即结束此函数的执行并将它的参数作为函数的值返回。return() 也会终止eval() 语句或者脚本文件的执行。

如果在全局范围中调用,则当前脚本文件中止运行。如果当前脚本文件是被 include() 的或者require() 的,则控制交回调用文件。此外,如果当前脚本是被include() 的,则return() 的值会被当作 include() 调用的返回值。如果在主脚本文件中调用return(),则脚本中止运行。如果当前脚本文件是在 php.ini 中的配置选项 auto_prepend_file 或者auto_append_file 所指定的,则此脚本文件中止运行。

注意既然return() 是语言结构而不是函数,因此其参数没有必要用括号将其括起来。通常都不用括号,实际上也应该不用,这样可以降低 PHP 的负担。当用引用返回值时永远不要使用括号,这样行不通。只能通过引用返回变量,而不是语句的结果。如果使用return ($a); 时其实不是返回一个变量,而是表达式 ($a) 的值(当然,此时该值也正是 $a 的值)。


22.require的用法:

require()

require() 语句包含并运行指定文件。

require() 语句包含并运行指定文件。有关包括如何工作的详细信息见include() 的文档。

require() include() 几乎完全一样,除了处理失败的方式不同之外。include() 产生一个Warningrequire() 则导致一个 Fatal Error。换句话说,如果想在丢失文件时停止处理页面,那就别犹豫了,用require() 吧。include() 就不是这样,脚本会继续运行。同时也要确认设置了合适的include_path

特别注意:require() 总是会尝试读取目标文件,即使它所在的行根本就不会执行。条件语句不会影响require()不过如果 require() 所在的行没有执行,则目标文件中的代码也不会执行。同样,循环结构也不影响 require() 的行为。尽管目标文件中包含的代码仍然是循环的主体,但 require() 本身只会运行一次。 因为是一个语言构造器而不是一个函数,不能被可变函数 调用。

23.include的用法:

如果在包含文件中定义有函数,这些函数可以独立于是否在 return() 之前还是之后在主文件中使用。如果文件被包含两次,PHP 5 发出致命错误因为函数已经被定义,但是 PHP 在return() 之后不会抱怨函数已定义。推荐使用include_once() 而不是检查文件是否已包含并在包含文件中有条件返回。

因为是一个语言构造器而不是一个函数,不能被可变函数 调用

24.require_once() 语句在脚本执行期间包含并运行指定文件。此行为和 require() 语句完全相同,唯一区别是如果该文件中的代码已经被包含了,则不会再次包含。

25.include_once() 语句在脚本执行期间包含并运行指定文件。此行为和 include() 语句类似,唯一区别是如果该文件中的代码已经被包含了,则不会再次包含。如同此语句名字暗示的那样,只会包含一次。

include_once() 在 Windows 下不区分大小写

26.goto的用法:

goto操作符可以用来跳转到程序中的某一指定位置。该目标位置可以用目标名称加上冒号来标记。PHP中的goto有一定限制,只能在同一个文件和作用域中跳转,也就是说你无法跳出一个函数或类方法,也无法跳入到另一个函数。你也无法跳入到任何循环或者switch 结构中。常见的用法是用来跳出循环或者switch,可以代替多层的break

27.


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值