Object Inheritance

Inheritance is a well-established programming principle, and PHP makes use of this principle in its object model. This principle will affect the way many classes and objects relate to one another.

For example, when you extend a class, the subclass inherits all of the public and protected methods from the parent class. Unless a class overrides those methods, they will retain their original functionality.

This is useful for defining and abstracting functionality, and permits the implementation of additional functionality in similar objects without the need to reimplement all of the shared functionality.

Note:

Unless autoloading is used, then classes must be defined before they are used. If a class extends another, then the parent class must be declared before the child class structure. This rule applies to classes that inherit other classes and interfaces.

Example #1 Inheritance Example

<?php

class foo
{
    public function 
printItem($string)
    {
        echo 
'Foo: ' $string PHP_EOL;
    }
    
    public function 
printPHP()
    {
        echo 
'PHP is great.' PHP_EOL;
    }
}

class 
bar extends foo
{
    public function 
printItem($string)
    {
        echo 
'Bar: ' $string PHP_EOL;
    }
}

$foo = new foo();
$bar = new bar();
$foo->printItem('baz'); // Output: 'Foo: baz'
$foo->printPHP();       // Output: 'PHP is great' 
$bar->printItem('baz'); // Output: 'Bar: baz'
$bar->printPHP();       // Output: 'PHP is great'

?>

Коментарии

You can force a class to be strictly an inheritable class by using the "abstract" keyword. When you define a class with abstract, any attempt to instantiate a separate instance of it will result in a fatal error. This is useful for situations like a base class where it would be inherited by multiple child classes yet you want to restrict the ability to instantiate it by itself.

Example........

<?php

abstract class Cheese
{
     
//can ONLY be inherited by another class
}

class 
Cheddar extends Cheese
{
}

$dinner = new Cheese//fatal error
$lunch = new Cheddar//works!

?>
2009-10-27 08:01:45
http://php5.kiev.ua/manual/ru/language.oop5.inheritance.html
Here is some clarification about PHP inheritance – there is a lot of bad information on the net.  PHP does support Multi-level inheritance.  (I tested it using version 5.2.9).  It does not support multiple inheritance.
 
This means that you cannot have one class extend 2 other classes (see the extends keyword).  However, you can have one class extend another, which extends another, and so on. 
 
Example:
 
<?php
class {
       
// more code here
}
 
class 
extends {
       
// more code here
}
 
class 
extends {
       
// more code here
}
 
 
$someObj = new A();  // no problems
$someOtherObj = new B(); // no problems
$lastObj = new C(); // still no problems
 
?>
2010-04-14 23:53:15
http://php5.kiev.ua/manual/ru/language.oop5.inheritance.html
I was recently extending a PEAR class when I encountered a situation where I wanted to call a constructor two levels up the class hierarchy, ignoring the immediate parent.  In such a case, you need to explicitly reference the class name using the :: operator.

Fortunately, just like using the 'parent' keyword PHP correctly recognizes that you are calling the function from a protected context inside the object's class hierarchy.

E.g:

<?php
class foo
{
  public function 
something()
  {
    echo 
__CLASS__// foo
   
var_dump($this);
  }
}

class 
foo_bar extends foo
{
  public function 
something()
  {
    echo 
__CLASS__// foo_bar
   
var_dump($this);
  }
}

class 
foo_bar_baz extends foo_bar
{
  public function 
something()
  {
    echo 
__CLASS__// foo_bar_baz
   
var_dump($this);
  }

  public function 
call()
  {
    echo 
self::something(); // self
   
echo parent::something(); // parent
   
echo foo::something(); // grandparent
 
}
}

error_reporting(-1);

$obj = new foo_bar_baz();
$obj->call();

// Output similar to:
// foo_bar_baz
// object(foo_bar_baz)[1]
// foo_bar
// object(foo_bar_baz)[1]
// foo
// object(foo_bar_baz)[1]

?>
2010-09-19 12:37:58
http://php5.kiev.ua/manual/ru/language.oop5.inheritance.html
The Idea that multiple inheritence is not supported is correct but with tratits this can be reviewed.

for e.g.
 
<?php
trait  custom
{
     public function 
hello()
     {
          echo 
"hello";
     }
}

trait 
custom2
{
       public function 
hello()
       {
            echo 
"hello2";
       }
}

class 
inheritsCustom
{
        use 
customcustom2
       
{
             
custom2::hello insteadof custom;
        }
}

$obj = new inheritsCustom();
$obj->hello();
?>
2015-07-01 08:59:16
http://php5.kiev.ua/manual/ru/language.oop5.inheritance.html
I think the best way for beginners to understand inheritance is through a real example so here is a simple example I can gave to you 

<?php

class Person
{
    public 
$name;
    protected 
$age;
    private 
$phone;

    public function 
talk(){
       
//Do stuff here
   
}

    protected function 
walk(){
       
//Do stuff here
   
}

    private function 
swim(){
       
//Do stuff here
   
}
}

class 
Tom extends Person
{
   
/*Since Tom class extends Person class this means 
        that class Tom is a child class and class person is 
        the parent class and child class will inherit all public 
        and protected members(properties and methods) from
        the parent class*/

     /*So class Tom will have these properties and methods*/

     //public $name;
     //protected $age;
     //public function talk(){}
     //protected function walk(){}

     //but it will not inherit the private members 
     //this is all what Object inheritance means
}
2017-06-12 01:50:36
http://php5.kiev.ua/manual/ru/language.oop5.inheritance.html
I've noticed one thing concerning inheritance...
When declaring an abstract class with a private method,
which is overridden by a sub-class, private takes precedence over public for child class...
(in the case you're redeclaring a method with a different signature in fact).

Hope this helps
2018-09-06 22:58:03
http://php5.kiev.ua/manual/ru/language.oop5.inheritance.html
Автор:
PHP7 gives you a warning if you redeclare a function in a child class with different parameters. For example:

class foo {
     function print($text='') {
          print text;
     }
}

class bar extends foo {
      function print($text1='',$text2='') {
           print text1.text2
      }
}

will give a PHP Warning:  Declaration of bar::print($text1 = '', $text2 = '') should be compatible with foo::print($text= '').
2019-01-25 09:21:17
http://php5.kiev.ua/manual/ru/language.oop5.inheritance.html
Inheritance works at create time, i.e. using the keyword 'new'. Static properties confused my understanding, so in order tho show the effect of visibility to inherintence I've created a simple demo script along with some set and get magic:

<?php
class {
private 
$a   'private';
protected 
$b 'protected';
public 
$c    'public';
static 
$d    'static';
public function 
__construct()
{
   
$this->'constructed';
}
public function 
__set($property$value)
{
    echo 
' set ' $property '=' $value;
   
$this->$property=$value;
}
public function 
__get($property)
{
    echo 
' get ' $property;
   
$this->$property 'dynamic'// invokes __set() !!
   
return $this->$property;
}
}

class 
extends A
{
public function 
constructMe()
{
   
$this->'constructed2';
}
}

class 
extends B
{
public function 
__construct()
{
   
parent::constructMe();
}
}

echo 
" \n";
$a = new A();
$b = new B();
echo 
" \n";
echo 
' B:c='.$b->c;
echo 
" \n";
echo 
' B:d=' .$b->d;
echo 
" \n";

$c = new C();
echo 
" \n";

print_r($a);
print_r($b);
print_r($c);

print_r(A::$d);
print_r(B::$d);
print_r(C::$d);

echo 
'A class: ';
$R = new reflectionclass('A');
print_r($R->getdefaultproperties());
print_r($R->getstaticproperties());
echo 
'B class: ';
$R = new reflectionclass('B');
print_r($R->getdefaultproperties());
print_r($R->getstaticproperties());

?>

This outputs:

 set e=constructed 
 B:c=public 
 get d set d=dynamic B:d=dynamic 
 set e=constructed2 
A Object
(
    [a:A:private] => private
    [b:protected] => protected
    [c] => public
    [e] => constructed
)
B Object
(
    [a:A:private] => private
    [b:protected] => protected
    [c] => public
    [d] => dynamic
)
C Object
(
    [a:A:private] => private
    [b:protected] => protected
    [c] => public
    [e] => constructed2
)
staticstaticstaticA class: Array
(
    [d] => static
    [a] => private
    [b] => protected
    [c] => public
)
Array
(
    [d] => static
)
B class: Array
(
    [d] => static
    [b] => protected
    [c] => public
)
Array
(
    [d] => static
)

This shows how private variables ($a) are inherited, how static variables ($d) are inherited (by the class, not by the object) and that changing or adding variables in the parent ($e, $d) are not inherited by the child.
2020-01-04 15:39:30
http://php5.kiev.ua/manual/ru/language.oop5.inheritance.html

    Поддержать сайт на родительском проекте КГБ