Parent class property php

get_parent_class

Возвращает имя родительского класса для объекта или класса.

Список параметров

Тестируемый объект или имя класса. Если вызывается из метода объекта, то этот параметр не обязателен.

Возвращаемые значения

Возвращает имя родительского класса, если object_or_class является объектом или именем класса.

Замечание:

Если объект не имеет родителя или переданного класса с таким именем не существует, то возвращается false .

Если функция вызвана без параметров вне объекта, эта функция возвращает false .

Список изменений

Версия Описание
8.0.0 Параметр object_or_class теперь принимает только объекты или корректные имена классов

Примеры

Пример #1 Пример использования get_parent_class()

class Dad function __construct ()
// реализация какой-нибудь логики
>
>

class Child extends Dad function __construct ()
echo «I’m » , get_parent_class ( $this ) , «‘s son\n» ;
>
>

class Child2 extends Dad function __construct ()
echo «I’m » , get_parent_class ( ‘child2’ ) , «‘s son too\n» ;
>
>

$foo = new child ();
$bar = new child2 ();

Результат выполнения данного примера:

I'm Dad's son I'm Dad's son too

Смотрите также

  • get_class() — Возвращает имя класса, к которому принадлежит объект
  • is_subclass_of() — Проверяет, содержит ли объект в своём дереве предков указанный класс либо прямо реализует его
  • class_parents() — Возвращает список родительских классов заданного класса

User Contributed Notes 7 notes

An output of the entire inheritance chain using closures, recursion, and OOP

if (empty($chain))
$chain = $className;

if ($parent !== false) $chain .= » > «;
return $function($parent);
>

class Child extends ParentClass <>
class SubChild extends Child <>
class Sub2 extends SubChild <>
class Sub3 extends Sub2 <>
class Sub4 extends Sub3 <>
class Sub5 extends Sub4 <>
class Sub6 extends Sub5 <>
class Sub7 extends Sub6 <>

$getChain = Sub7::getChain();
printf(«%s\n», $getChain(‘Sub3’));

Output is:
Sub7 > Sub6 > Sub5 > Sub4 > Sub3 > Sub2 > SubChild > Child > ParentClass
Sub3 > Sub2 > SubChild > Child > ParentClass

Note that from PHP 5.5 you can also use `parent::class` from within a method, e.g.

function child ()
echo «I’m » , parent ::class, «‘s son\n» ;
>
?>

Looks a bit tidier and technically probably more optimal, as it avoids a function call lookup.

I wrote a simple function doing the reverse thing: get the children:

function get_child ( $instance , $classname ) $class = $classname ;
$t = get_class ( $instance );
while (( $p = get_parent_class ( $t )) !== false ) if ( $p == $class ) return $t ;
>
$t = $p ;
>
return false ;
>

abstract class A function someFunction () return get_child ( $this , __CLASS__ );
>
>

$c = new C ();
echo $c -> someFunction (); //displays B

PHP (4 at least, dunno about 5) stores classnames in lower case, so:

echo get_parent_class ( ‘Bar’ );

Читайте также:  Php проверка корректности email

echo get_parent_class ( ‘bar’ );

You can use this function to find common parent of multiple objects or classes.

/**
* Returns name of the first (in class hierarchy) common parent class of all provided objects or classes.
* Returns FALSE when common class is not found.
*
* @param mixed $objects Array that can contain objects or class names.
* @return mixed
*/
function get_first_common_parent ( $objects ) $common_ancestors = null ;
foreach( $objects as $object ) if ( is_object ( $object )) $class_name = get_class ( $object );
> else $class_name = $object ;
>

$parent_class_names = array();
$parent_class_name = $class_name ;
do $parent_class_names [] = $parent_class_name ;
> while( $parent_class_name = get_parent_class ( $parent_class_name ));

if ( $common_ancestors === null ) $common_ancestors = $parent_class_names ;
> else $common_ancestors = array_intersect ( $common_ancestors , $parent_class_names );
>
>

return reset ( $common_ancestors );
>
?>

Example:

//returns «A»
get_first_common_parent (array( ‘G’ , ‘E’ ));

//returns «F»
get_first_common_parent (array(new G (), ‘F’ ));

//returns false (no common parent)
get_first_common_parent (array( ‘C’ , ‘H’ ));

//returns false (non-existent class provided)
get_first_common_parent (array(new B (), ‘X’ ));
?>

«‘If called without parameter outside object’ What on earth does that mean?»

There are two places this could be called:
1. From within a member function of an object. In this case, it may be called with no parameters and will return the parent class of the object owning the member function. (If the parameter is included, then it will return the parent class of the specified class as normal.)

2. From outside an object (i.e., global or function scope). In this case, PHP doesn’t know what class you’re talking about if you don’t include a parameter, so it returns FALSE. (But, of course, it works if you specify the class with the parameter.)

If the argument obj is a string and the class is not defined, then the function returns FALSE.

If the argument obj is an object created from a class with no ancestors (or a string representing a class with no ancestors), then the function returns FALSE.

  • Функции работы с классами и объектами
    • class_​alias
    • class_​exists
    • enum_​exists
    • get_​called_​class
    • get_​class_​methods
    • get_​class_​vars
    • get_​class
    • get_​declared_​classes
    • get_​declared_​interfaces
    • get_​declared_​traits
    • get_​mangled_​object_​vars
    • get_​object_​vars
    • get_​parent_​class
    • interface_​exists
    • is_​a
    • is_​subclass_​of
    • method_​exists
    • property_​exists
    • trait_​exists
    • _​_​autoload

    Источник

    PHP: Наследование

    Наследование — это механизм объектно ориентированного программирования, который позволяет описать новый класс на основе уже существующего (родительского).

    Класс, который получается в результате наследования от другого, называется подклассом. Эту связь обычно описывают с помощью терминов «родительский» и «дочерний». Дочерний класс происходит от родительского и наследует его характеристики: свойства и методы. Обычно в подклассе к функциональности родительского класса (который также называют суперклассом) добавляются новые функциональные возможности.

    Чтобы создать подкласс, необходимо использовать в объявлении класса ключевое слово extends , и после него указать имя класса, от которого выполняется наследование:

    age = $age; > function add_age () < $this->age++; > > // объявляем наследуемый класс class my_Cat extends Cat < // определяем собственный метод подкласса function sleep() < echo '
    Zzzzz. '; > > $kitty = new my_Cat(10); // вызываем наследуемый метод $kitty->add_age(); // считываем значение наследуемого свойства echo $kitty->age; // вызываем собственный метод подкласса $kitty->sleep(); ?>

    Подкласс наследует доступ ко всем методам и свойствам родительского класса, так как они имеют тип public . Это означает, что для экземпляров класса my_Cat мы можем вызывать метод add_age() и обращаться к свойству $age не смотря на то, что они определены в классе cat . Также в приведенном примере подкласс не имеет своего конструктора. Если в подклассе не объявлен свой конструктор, то при создании экземпляров подкласса будет автоматически вызываться конструктор суперкласса.

    Обратите внимание на то, что в подклассах могут переопределяться свойства и методы. Определяя подкласс, мы гарантируем, что его экземпляр определяется характеристиками сначала дочернего, а затем родительского класса. Чтобы лучше это понять рассмотрим пример:

    age"; > > class my_Cat extends Cat < public $age = 10; >$kitty = new my_Cat; $kitty->foo(); ?>

    При вызове $kitty->foo() интерпретатор PHP не может найти такой метод в классе my_Cat , поэтому используется реализация этого метода заданная в классе Cat . Однако в подклассе определено собственное свойство $age , поэтому при обращении к нему в методе $kitty->foo() , интерпретатор PHP находит это свойство в классе my_Cat и использует его.

    Так как мы уже рассмотрели тему про указание типа аргументов, осталось сказать о том, что если в качестве типа указан родительский класс, то все потомки для метода будут так же доступны для использования, посмотрите на следующий пример:

     > class my_Cat extends Cat <> $kitty = new Cat; // передаем методу экземпляр класса my_Cat $kitty->foo( new my_Cat ); ?>

    Мы можем обращаться с экземпляром класса my_Cat так, как будто это объект типа Cat , т.е. мы можем передать объект типа my_Cat методу foo() класса Cat , и все будет работать, как надо.

    Оператор parent

    На практике подклассам бывает необходимо расширить функциональность методов родительского класса. Расширяя функциональность за счет переопределения методов суперкласса, в подклассах вы сохраняете возможность сначала выполнить программный код родительского класса, а затем добавить код, который реализует дополнительную функциональность. Давайте разберем как это можно сделать.

    Чтобы вызвать нужный метод из родительского класса, вам понадобится обратиться к самому этому классу через дескриптор. Для этой цели в PHP предусмотрено ключевое слово parent . Оператор parent позволяет подклассам обращаться к методам (и конструкторам) родительского класса и дополнять их существующую функциональность. Чтобы обратиться к методу в контексте класса, используются символы » :: » (два двоеточия). Синтаксис оператора parent :

    parent::метод_родительского_класа

    Эта конструкция вызовет метод, определенный в суперклассе. Вслед за таким вызовом можно поместить свой программный код, который добавит новую функциональность:

    title = $title; $this->price = $price; > > class new_book extends book < public $pages; function __construct($title, $price, $pages) < // вызываем метод-конструктор родительского класса parent::__construct($title, $price); // инициализируем свойство определенное в подклассе $this->pages = $pages; > > $obj = new new_book('азбука', 35, 500); echo "Книга: $obj->title 
    Цена: $obj->price
    Страниц: $obj->pages"; ?>

    Когда в дочернем классе определяется свой конструктор, PHP не вызывает конструктор родительского класса автоматически. Это необходимо сделать вручную в конструкторе подкласса. Подкласс сначала в своем конструкторе вызывает конструктор своего родительского класса, передавая нужные аргументы для инициализации, исполняет его, а затем выполняется код, который реализует дополнительную функциональность, в данном случае инициализирует свойство подкласса.

    Ключевое слово parent можно использовать не только в конструкторах, но и в любом другом методе, функциональность которого вы хотите расширить, достигнуть этого можно, вызвав метод родительского класса:

    name>."; return $str; > > class my_Cat extends Cat < public $age = 5; function getstr() < $str = parent::getstr(); $str .= "
    Возраст: age> лет."; return $str; > > $obj = new my_Cat; echo $obj->getstr(); ?>

    Здесь сначала вызывается метод getstr() из суперкласса, значение которого присваивается переменной, а после этого выполняется остальной код определенный в методе подкласса.

    Теперь, когда мы познакомились с основами наследования, можно, наконец, рассмотреть вопрос видимости свойств и методов.

    public, protected и private: управление доступом

    До этого момента мы явно объявляли все свойства как public (общедоступные). И такой тип доступа задан по умолчанию для всех методов.

    Элементы класса можно объявлять как public (общедоступные), protected (защищенные) и private (закрытые). Рассмотрим разницу между ними:

    • К public (общедоступным) свойствам и методам, можно получить доступ из любого контекста.
    • К protected (защищенным) свойствам и методам можно получить доступ либо из содержащего их класса, либо из его подкласса. Никакому внешнему коду доступ к ним не предоставляется.
    • Вы можете сделать данные класса недоступными для вызывающей программы с помощью ключевого слова private (закрытые). К таким свойствам и методам можно получить доступ только из того класса, в котором они объявлены. Даже подклассы данного класса не имеют доступа к таким данным.

    public — открытый доступ:

    hello"; > > $obj = new human; // доступ из вызывающей программы echo "$obj->age"; // Допустимо $obj->say(); // Допустимо ?>

    private — доступ только из методов класса:

    age"; > > $obj = new human; // напрямую из вызывающей программы доступа к закрытым данным нет echo "$obj->age"; // Ошибка! доступ закрыт! // однако с помощью метода можно выводить закрытые данные $obj->say(); // Допустимо ?>

    protected — защищенный доступ:

    Модификатор protected с точки зрения вызывающей программы выглядит точно так же, как и private : он запрещает доступ к данным объекта извне. Однако в отличие от private он позволяет обращаться к данным не только из методов своего класса, но также и из методов подкласса.

    Копирование материалов с данного сайта возможно только с разрешения администрации сайта
    и при указании прямой активной ссылки на источник.
    2011 – 2023 © puzzleweb.ru

    Источник

Оцените статью