写在前面的话
自己写php代码也有半年的时间了,在这半年里,有收获,有喜悦,也有迷惑. 从不懂php, 到现在可以作为一个普普通通的板砖人士. 回过头来发现自己对于PHP基础的东西还是不会. 决定回到以前,重新学习PHP基础知识。 从最为经典的《PHP权威指南》入手,把自己看到记录下来,一来回顾,二来鞭策自己。 希望能与大家一起共勉
1.对象的引用
- 在php 5之前的版本,如果把一个对象变量赋值给一个新的变量,那么这个新的变量并不是和原来的变量指向同一对象,而是重新创建一个新的对象. 当然现在不会出现这一问题, 如果要使用创建对象的副本可以使用 clone, 如:
$new-object=clone $object
,来创建一个新的对象. 我们也可以创建一个类,来证明上面所说的
class Person
{
private $name;
public function getName()
{
return $this->name;
}
public function setName($name)
{
$this->name = $name;
}
public function __construct($name)
{
$this->setName($name);
}
}
$Person=new Person('123');
echo $Person->getName()."<br/>";
$PersonTwo=$Person;
$PersonTwo->setName('456');
echo $Person->getName()."<br/>";
$PersonThree= clone $Person;
$PersonThree->setName('789');
echo $Person->getName();
/**
输出结果:
123
456
456
**/
从上面输出的结果可以看出,现在的PHP版本,对于对象变量间的赋值是引用赋值,而不是新建对象. 而clone 可以生成一个新的对象. clone在拷贝对象的时候,会见对象的属性值等信息一起拷贝.
- 我们也可以用
instanceof
来监测这个对象变量是哪个对象的,
$Person=new Person('123');
echo $Person instanceof Person;
//返回1表示是这个对象的变量, 返回0则不是
//输出: 1
2. final声明的方法和类
- 用final方法声明过的类,是不能继承的, 如果继承这样的类,php会发出这样的错误信息,
Fatal error: Class PersonT may not inherit from final class (Person),翻译过来的意思是: 致命的错误,final类Person不能被PersonT类继承.
//即便你的类中什么也不写, 你也不实例化它,就把他放在脚本里,你在运行脚本的时候,就会发生Fatal error
class PersonT extends Person
{
}
- final 声明的方法不可以被重写, 也就是不能再子类中定义这个方法,同样的也是致命错误:
Fatal error: Cannot override final method Person::setName()
//用final定义的的方法是Person类中的setName方法
class PersonT extends Person
{
public function setName($name){
echo $name;
}
}
3.静态方法和静态属性
静态方法不用实例化类,直接使用类名就可以调用, 比如Singleton::getInstance()
,在静态方法里头不能使用$this, 因为它没有绑定到具体的对象。静态属性可以用类自身来访问self::instance
, 静态方法也可以使用self来访问,当然这个静态方法必须是类自己的
//这里我们创建了一单件模式
class Singleton
{
private static $instance = null;
public static $param=321;
private function __construct()
{}
public static function getInstance()
{
if (self::$instance == null) {
self::$instance = new Singleton();
}
return self::$instance;
}
public function __toString()
{
return 'object';
}
}
echo Singleton::getInstance();
echo Singleton::$param;
//输出: object 321
4.抽象类和抽象方法
- 抽象类,就是用abstract 定义的类就是抽象类, 抽象类中可以没有抽象方法,但是抽象类不能实例化, 必须由子类继承,然后实例化.如果子类没有实例化抽象类中的抽象方法,在加载子类脚本文件的会发生致命错误.
//在加载这个脚本文件的时候就会有错误信息提示
abstract class BaseClass
{
protected $name;
abstract public function getName();
public function setName($name)
{
$this->name = $name;
}
}
class MyClass extends BaseClass
{
// public function getName()
// {
// echo $this->name;
// }
}
5.函数声明的时候可以给参数进行对象类型提示
如果我们在给函数或者方法传递参数的时候,为了避免传入错误的对象变量,可以使用 function test(Singleton $object)
,这样声明函数后,如果传入的对象类型不是Singleton,有这样的错误提示:
Catchable fatal error: Argument 1 passed to test() must be an instance of Singleton
//代码块
function test(Singleton $object){
echo '1234';
}
test(new Person('12'));
今天的内容就到这里, 晚安!!