前言:跟着菜鸟教程学习PHP,里面有八个模块,初学完第一个模块,特意总结了一些易错的知识点:从PHP语法至PHP面向对象
1."." 和 ","连接字符串的区别:
. (实心点):将多个字符串连接成一个字符串,例:
<?php
$a = "hello ";
$b = "world!";
echo $a.$b;
?>
hello world!
上述例子有三个字符串,分别为:$a、 $b、 $a. $b
,(逗号):将多个字符串拼接起来,例:
<?php
$a = "hello ";
$b = "world!";
echo $a,$b;
?>
hello world!
上述例子有两个字符串,分别为:$a、 $b
2.print和echo的区别:
print只能输出一个字符串,而echo可以输出一个或多个字符串。所以当用","(逗号)连接字符串输出时,只能用echo!
3.switch-case的值的比较:
PHP中有"= ="(松散比较) 和 “= = =”(严格比较),那么switch-case中的值的对比是哪种比较呢?答案就是:"= ="(松散比较),例:
<?php
switch("1"){
case 1:
echo "a";
break;
default:
echo "b";
break;
}
?>
a
4." "(双引号)和’ '(单引号)的区别:
" "(双引号)内可以使用转义字符,’ '(单引号)按原样输出,但:\ \是单引号字符串字面量中的一个特殊情况,它给出了一个单引号字符串字面值量中没有插入\,\n,例:
<?php
$str = 'a\\b\n';
echo $str;
?>
a\b\n
5.非限定名称、限定名称和完全限定名称的区别:
非限定名称:(只限定了自己的名称)
例:Exception( ),调用时先尝试调用namespace\Exception( ),再尝试调用全局的Exception( )
限定名称:(限定了部分路径)
例:Another\Exception( ),调用namespace\Another\Exception( )
完全限定名称:(限定了绝对路径,namespace为全局;并且完全限定名称是确定的,故不受导入的影响)
例:\Exception( ),调用全局函数Exception( )
6. “::”(双冒号)的用法:
调用类中的静态方法或属性,例:
<?php
class test{
static public $a = "a";
static public function b(){echo "b";}
}
echo test::$a . PHP_EOL;
test::b();
?>
a
b
调用自身类或父类的属性或方法(与类对象使用"->"调用属性或方法相同),例:
<?php
class test{
public function b(){echo "test's b()";}
}
class tests extends test{
public function bs(){echo "tests's bs()";}
}
tests::b();
tests::bs();
$b = new tests;
$b->b();
$b->bs();
?>
test's b()
tests's bs()
test's b()
tests's bs()
补充:
1.与"->"的主要的区别:
双冒号是用于不创建对象的情况下(用类名)调用函数,类名::函数名;
->则是需要基于对象存在的情况下才可使用,类名->函数名为错误用法。
2.1.对象调用函数:
法一:对象::函数名;
法二:对象->函数名;
2.2.类名调用函数:
类名::函数名;
7.用不同方式调用函数的注意点:
我们可以用new字符创建的对象来调用函数;也可以用类名调用;还可以把类名赋给某个字符串,让该字符串对象按着类名调用的方式调用函数等。但是在命名空间存在的情况下,这几种方式的使用有些地方需要注意一下,例子:
<?php
namespace mytest;
class MyClass
{
const CONSTANT = '常量值';
function showConstant(){
echo self::CONSTANT . '3' . PHP_EOL;
}
}
echo MyClass::CONSTANT . '1' . PHP_EOL;
$classname = 'MyClass';
echo $classname::CONSTANT . '2' . PHP_EOL;//自5.3.0起
$class = new MyClass();
$class->showConstant();
echo $class::CONSTANT . '4' . PHP_EOL;//自PHP5.3.0起
?>
常量值1
PHP Fatal error: Uncaught Error: Class 'MyClass' not found in /box/main.php:15 Stack trace:
#0 {main}
throw in /box/main.php on line 15
把" $classname = ‘MyClass’ “改为” $classname = ‘mytest\MyClass’ "
常量值1
常量值2
常量值3
常量值4
所以无论在有无命名空间namespace的情况下,用new创建类对象的方式、用类名调用函数的方式和自身调用的方式不会受到影响;而在命名空间namespace存在的情况下,用类名赋给字符串再调用的方式( $ classname = ‘MyClass’ ; $ classname::showConstant();)会有异常,类似于( $classname = ‘\MyClass’ ,完全限定名称,namespace为全局)
参考文档 | 菜鸟教程 | PHP教程