PHP类继承

PHP教程 - PHP类继承

PHP类继承

使用继承,我们可以创建基于父类的子类。

子类继承所有属性和方法,也可以添加其他属性和方法。

要创建基于父类的子类,请使用extends关键字,如下所示:

<?PHP
class Shape { 
   // (General Shape properties and methods here) 
} 
              
class Circle extends Shape { 
   // (Circle-specific properties and methods here) 
}     
?>

为了扩展Dog类,我们可以使用extends关键字。

<?PHP
class Dog {
    public function bark() {
       print "Woof!\n";
    }
}

class Puppy extends Dog {
   
}
?>


例子

下面的代码显示了如何用self调用当前类。

<?php
  class Animal
  {
    public $blood;
    public $name;

    public function __construct($blood, $name=NULL)
    {
      $this->blood = $blood;
      if($name)
      {
        $this->name = $name;
      }
    }
  }

  class Mammal extends Animal
  {
    public $furColor;
    public $legs;

    function __construct($furColor, $legs, $name=NULL)
    {
      parent::__construct("warm", $name);
      $this->furColor = $furColor;
      $this->legs = $legs;
    }
  }

  class Dog extends Mammal
  {
    function __construct($furColor, $name)
    {
      parent::__construct($furColor, 4, $name);
      self::bark();
    }

    function bark()
    {
      print("$this->name says "woof!"");
    }
  }

  $d = new Dog("Black and Tan", "Angus");
?>


上面的代码生成以下结果。



实施例2

下面的代码显示了如何调用父构造函数。

<?php

class Calculator {
  protected $_val1, $_val2;

  public function __construct( $val1, $val2 ) {
    $this->_val1 = $val1;
    $this->_val2 = $val2;
  }

  public function add() {
    return $this->_val1 + $this->_val2;
  }

  public function subtract() {
    return $this->_val1 - $this->_val2;
  }

  public function multiply() {
    return $this->_val1 * $this->_val2;
  }

  public function divide() {
    return $this->_val1 / $this->_val2;
  }
}

class CalcAdvanced extends Calculator {
  private static $_allowedFunctions = array( "pow" => 2, "sqrt" => 1, "exp" => 1 );

  public function __construct( $val1, $val2=null ) {
    parent::__construct( $val1, $val2 );
  }

  public function __call( $methodName, $arguments ) {
    if ( in_array( $methodName, array_keys( CalcAdvanced::$_allowedFunctions ) ) ) {
      $functionArguments = array( $this->_val1 );
      if ( CalcAdvanced::$_allowedFunctions[$methodName] == 2 ) array_push( $functionArguments, $this->_val2 );
      return call_user_func_array( $methodName, $functionArguments );
    } else {
      die ( "<p>Method "CalcAdvanced::$methodName" doesn"t exist</p>" );
    }
  }
}
$ca = new CalcAdvanced( 3, 4 );
echo "<p>3 + 4 = " . $ca->add() . "</p>";
echo "<p>3 - 4 = " . $ca->subtract() . "</p>";
echo "<p>3 * 4 = " . $ca->multiply() . "</p>";
echo "<p>3 / 4 = " . $ca->divide() . "</p>";
echo "<p>pow( 3, 4 ) = " . $ca->pow() . "</p>";
echo "<p>sqrt( 3 ) = " . $ca->sqrt() . "</p>";
echo "<p>exp( 3 ) = " . $ca->exp() . "</p>";

?>


上面的代码生成以下结果。

PHP覆盖方法

创建方法与中的相应方法不同的子类父类通过重写父类“s"方法在子类中。

为此,只需在子类中创建一个具有相同名称的方法。 然后,当为子类的对象调用该方法名时,运行子类的方法而不是父类的方法:

<?PHP
class ParentClass { 
  public function someMethod() { 
    // (do stuff here) 
  } 
} 
     
class ChildClass extends ParentClass { 
  public function someMethod() { 
    // This method is called instead for ChildClass objects 
  } 
} 

$parentObj = new ParentClass; 
$parentObj->someMethod();  // Calls ParentClass::someMethod() 
$childObj = new ChildClass; 
$childObj->someMethod();   // Calls ChildClass::someMethod()  
?>

PHP允许我们重新定义子类中的方法。这通过重新定义方法来完成里面的子类:

<?PHP
class Dog {
    public function bark() {
       print "Dog";
    }
}

class Puppy extends Dog {
   public function bark() {
      print "Puppy";
   }
}
?>

保留父类的功能

要调用重写的方法,在方法名之前写parent :::

parent::someMethod();
<?php 
    class Fruit { 
      public function peel() { 
        echo "peeling the fruit.\n"; 
      } 
      public function slice() { 
        echo "slicing the fruit.\n"; 
      } 
            
      public function eat() { 
        echo "eating the fruit. \n"; 
      } 
            
      public function consume() { 
        $this-> peel(); 
        $this-> slice(); 
        $this-> eat(); 
      } 
    } 
    class Banana extends Fruit { 
        public function consume() { 
          echo " < p > I"m breaking off a banana... < /p > "; 
          parent::consume(); 
        } 
     } 

     $apple = new Fruit; 
     $apple->consume(); 
                 
     $banana = new Banana; 
     $banana->consume();   
                     
?>  

上面的代码生成以下结果。

PHP最终类和方法

锁定一个类,使它不能被继承。或者锁定类中的一个或多个方法,以便他们可以不在子类中覆盖。

通过这样做,你知道你的类或类中的方法将始终以完全相同的方式表现。

您可以在类或方法定义之前添加关键字final以锁定该类或方法。

这里的如何创建一个final类:

final class MyClass { 

} 

这里是你如何做最终的方法:

class ParentClass { 
   public final function myMethod() { 
            echo "A method"; 
   } 
} 
0.0807s