一、几个输出语句的区别
- echo
echo没有返回值,只接受一个参数,可以不使用括号1
2
3
4
5
6
7
$a = echo("Hello World"); // 错误,因为 echo 没返回值,不能用来赋值
echo "Hello World"; // 正确,输出 Hello World
echo ("Hello World"); //正确,输出 Hello World
echo ("Hello","Wrold"); //错误,因为传递多个参数的时候不能用括号
echo "Hello"," World"," is", " web"; // 正确,不用括号的时候可以用逗号隔开多个值 - print
和echo几乎一样,但是print有返回值1,虽然没啥用,但是因此会比echo效率低一点1
2
3
4
5
$x = print("Hello World"); // 输出 Hello World
echo $x; // 输出 1
print "Hello World"; //输出 Hello World - printf
printf主要用来格式化字符串1
2
3
4
printf("First %s %s。","hello", "world"); // First hello world
printf("This is %1\$s %1\$s","A", "B"); //输出 This is A A,因为只显示第一个参数两次,而没有用到第二个参数 - sprintf
和printf一样,但是没有输出,而只是格式化字符串1
2
3
4
printf(“First %s %s。”,”hello”, “world”); // First hello world
printf(“This is %1\$s %1\$s”,”A”, “B”); //输出 This is A A,因为只显示第一个参数两次,而没有用到第二个参数 - print_r
主要用来将数组、对象等数据类型以更易展示的形式输出来1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$a = array ('a' => 'A', 'b' => 'B', 'c' => array ('a','b','c'));
print_r ($a);
结果如下:
Array
(
[a] => A
[b] => B
[c] => Array
(
[0] => a
[1] => b
[2] => c
)
) - var_dump
用于调试,还会把变量的内容和类型输出来,还有长度也会输出来1
2
3
4
5
6
$a=1.5;
var_dump($a); //float(1.5)
$a=2;
var_dump($a); //int(2)
二、单引号和双引号的区别
- 单引号只支持 \’和\转义,而双引号支持更多的转义
- 单引号不会解析变量值,双引号会
1
2
3
4
5
6
7
$age = 20;
$str1 = 'I am $age years old';
$str2 = "I am $age years old";
echo $str1,'<br />'; //输出: I am $age years old;
echo $str2,'<br />'; // 输出:I am 20 years old; - 单引号比双引号快
三、“::”、”->”和”=>”的区别
- “::”运算符是调用一个类中的静态成员的方法
1
2
3
4class test{
protected static $instance;
self::$instance = “abc”;
} - ”->”是操作类中成员变量或者方法的方法
1
2
3
4class test{
private $test;
$this->test = “abc”;
} - “=>”是映射数组中key和value时候使用的
四、构造函数和析构函数
- __construct 实例化对象的时候会被调用
- __destruct 对象呗销毁的时候被调用,因为PHP只会释放对象所占用的内存和相关资源,而由程序员自己申请的资源需要自己释放
1
2
3
4
5
6
7
8
9class Test{
protected $file = NULL;
function __construct(){
$this->file = fopen(“test.txt”,”r”);
}
function __destruct(){
fclose($this->file);
}
}
五、__call()和__callStatic()
- __call(),当调用一个不可访问的方法时会调用这个方法。
- __callStatic(),当调用的静态方法不存在或者权限不足的时候,会调用这个方法
1
2
3
4
5
6
7
8
9
10
11class Test
{
public function __call ($name, $arguments) {
echo “调用对象方法 ‘$name’ “. implode(‘, ‘,$arguments). “\n”;
}
public static function __callStatic ($name, $arguments) {
echo “调用静态方法 ‘$name’ “. implode(‘, ‘, $arguments). “\n”; }
}
$obj = new Test;
$obj->method1(‘参数 1’); //调用对象方法 'method1' 参数 1
Test::method2(‘参数 2’); //调用静态方法 'method2' 参数 2
六、值传递和引用传递
- 值传递,在方法调用中,实参会把它的值传递给形参,形参只是用实参的值初始化一个存储单元,所以实参和形参有相同的值,却有着不同的存储单元
- 引用传递,传递的是对象的引用,形参和实参指向的是同一块地址
七、public、private和protected的区别
- public表示全局可以访问,比如类内部、外部和子类
- protected表示受保护的,只有本类和子类可以访问
- private表示私有的,只有本类内部可以访问
八、继承
- 通过用一个extends来继承基类的方法和成员。
- 子类只能继承父类的非私有(包括public和protected)成员变量和方法
- 当子类中定义的成员变量和父类中定义的成员变量同名时,子类中的成员变量会覆盖 父类的成员变量
- 当子类中的方法与父类中的方法有相同的方法签名(相同的方法名,相同的参数个数 与类型)时,子类将会覆盖父类的方法,而不是重载。
接下来准备研究
- 各种排序方法的内部实现,sort(),ksort(),asort(),arsort(),rsort()
- extends 和 implements 的区别
- require 和 require_once 还有 include