final关键字:
不能使用final标识成员属性。
使用final标识的类,不能被继承。
如:final class Test{},Test类不能被继承。
在类中使用final标识的成员方法,在子类中不能被覆盖。
static关键字:
可以将类中的成员标识为静态的,既可以用来标识成员属性,也可以用来标识成员方法。
static成员总是唯一存在的,在多个对象之间共享的。使用static标识的成员是属于类的,所以与对象实例和其它的类无关。
类中的静态成员是不需要对象而使用类名来直接访问的。
类外访问时:
self::静态成员属性名
self::静态成员方法名
类中访问时:
self::静态成员属性名
self::静态成员方法名
静态方法只能访问静态成员。
可以使用类名或self在非静态方法中访问静态成员。
instanceof关键字:
确定一个对象是类的实例、类的子类,还是实现了某个特定的借口,并进行相应的操作。
$dog = new Animal();
if ($man instanceof Animal)
{
echo '$man是Animal类的实例对象';
}
clone关键字:
根据现有的对象克隆出一个完全一样的对象,克隆以后,原本和副本两个对象完全独立,互不干扰。
魔术方法__clone():
该方法是在对象克隆自动调用的,不需要任何参数,该方法中自动包含$this和$that两个对象的引用,
$this是副本对象的引用,而$that则是原本对象的引用。
不能使用final标识成员属性。
使用final标识的类,不能被继承。
如:final class Test{},Test类不能被继承。
在类中使用final标识的成员方法,在子类中不能被覆盖。
static关键字:
可以将类中的成员标识为静态的,既可以用来标识成员属性,也可以用来标识成员方法。
static成员总是唯一存在的,在多个对象之间共享的。使用static标识的成员是属于类的,所以与对象实例和其它的类无关。
类中的静态成员是不需要对象而使用类名来直接访问的。
类外访问时:
self::静态成员属性名
self::静态成员方法名
类中访问时:
self::静态成员属性名
self::静态成员方法名
静态方法只能访问静态成员。
可以使用类名或self在非静态方法中访问静态成员。
instanceof关键字:
确定一个对象是类的实例、类的子类,还是实现了某个特定的借口,并进行相应的操作。
$dog = new Animal();
if ($man instanceof Animal)
{
echo '$man是Animal类的实例对象';
}
clone关键字:
根据现有的对象克隆出一个完全一样的对象,克隆以后,原本和副本两个对象完全独立,互不干扰。
魔术方法__clone():
该方法是在对象克隆自动调用的,不需要任何参数,该方法中自动包含$this和$that两个对象的引用,
$this是副本对象的引用,而$that则是原本对象的引用。
<?php
class Single
{
public $hash;
static private $ins = null;
final protected function __construct()
{
$this->hash = mt_rand(1, 999999);
}
static public function getInstance()
{
if (self::$ins instanceof self)
{
return self::$ins;
}
self::$ins = new self();
return self::$ins;
}
private function __clone()
{
return self::$ins;
}
}
$s = Single::getInstance();
$s1 = Single::getInstance();
if ($s === $s1)
{
echo 'equal';
}
else
{
echo 'not equal';
}
echo '<hr />';
class Other extends Single //继承
{
}
$t1 = Other::getInstance();
$t2 = Other::getInstance();
if ($t1 === $t2)
{
echo 'equal';
}
else
{
echo 'not equal';
}
echo '<hr />';
$t3 = clone $t2; // 克隆,得到的是一个新对象
//var_dump($t3, $t2);
if ($t3 === $t2)
{
echo 'equal<br />';
}
else
{
echo 't3 and t2 not equal';
}
?>