PHP面向对象编程学习之二
接口
接口就是把不同类的共同行为经行了定义,然后在不同的类里面实现不同功能。当有很多人一起开发一个项目时,可能都会去调用别人写的一些类,那你就会问,我怎么知道他的某个功能的实现方法是怎么命名的呢,这个时候PHP接口类interface就起到作用了,当我们定义了一个接口类时,它里面的方式是下面的子类必须实现的,比如 :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | <?php
interface Shop
{
public function buy( $gid );
public function sell( $gid );
public function view( $gid );
}
class BaseShop implements Shop
{
public function buy( $gid )
{
echo ('你购买了ID为 :'. $gid .'的商品');
}
public function sell( $gid )
{
echo ('你卖了ID为 :'. $gid .'的商品');
}
public function view( $gid )
{
echo ('你查看了ID为 :'. $gid .'的商品');
}
}
?>
|
Copier après la connexion
多态
因为接口的实现方法可以有很多,所以对于接口里面顶一顶方法的具体实现是多种多样,这种特性称为多态。多态是指在面向对象中能够根据使用类的上下文来重新定义或改变类的性质和行为。
PHP不支持重载实现多态,但是PHP可以变向的实现多态效果。
案例一:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | <?
interface User{
public function getName();
public function setName( $_name );
}
class NormalUser implements User {
private $name ;
public function getName(){
return $this ->name;
}
public function setName( $_name ){
$this ->name = $_name ;
}
}
class UserAdmin{
public static function ChangeUserName(User $_user , $_userName ){
$_user ->setName( $_userName );
}
}
$normalUser = new NormalUser();
UserAdmin::ChangeUserName( $normalUser , "Tom" );
echo $normalUser ->getName();
?>
|
Copier après la connexion
案例二:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | <?php
function open_database( $DB , $cache_size_or_values =null, $cache_size =null)
{
switch (function_num_args())
{
case 1:
$r = select_db( $DB );
break ;
case 2:
$r = select_db( $DB , $cache_size_or_values );
break ;
case 3:
$r = select_db( $DB , $cache_size_or_values , $cache_size );
break ;
}
return is_resource ( $r );
}
?>
|
Copier après la connexion
抽象类
抽象类是介于接口与类的定义之间
PHP5支持抽象类和抽象方法。抽象类不能直接被实例化,你必须先继承该抽象类,然后再实例化子类。抽象类中 至少要包含一个抽象方法。如果类方法被声明为抽象的,那么其中就不能包括具体的功能实现。
继承一个抽象类的时候,子类必须实现抽象类中的所有抽象方法;另外,这些方法的可见性 必须和抽象类中一样(或者更为宽松)。如果抽象类中某个抽象方法被声明为protected,那么子类中实现的方法就应该声明为protected或者public,而不 能定义为private。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 | <?php
abstract class AbstractClass
{
abstract protected function getValue();
abstract protected function prefixValue( $prefix );
public function printOut() {
print $this ->getValue() . " " ;
}
}
class ConcreteClass1 extends AbstractClass
{
protected function getValue() {
return "ConcreteClass1" ;
}
public function prefixValue( $prefix ) {
return "{$prefix}ConcreteClass1" ;
}
}
class ConcreteClass2 extends AbstractClass
{
public function getValue() {
return "ConcreteClass2" ;
}
public function prefixValue( $prefix ) {
return "{$prefix}ConcreteClass2" ;
}
}
$class1 = new ConcreteClass1;
$class1 ->printOut();
echo $class1 ->prefixValue('FOO_') . " " ;
$class2 = new ConcreteClass2;
$class2 ->printOut();
echo $class2 ->prefixValue('FOO_') . " " ;
?>
|
Copier après la connexion