<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="es">
	<id>https://manuais.iessanclemente.net/index.php?action=history&amp;feed=atom&amp;title=Curso_POO_PHP_Herdanza</id>
	<title>Curso POO PHP Herdanza - Historial de revisiones</title>
	<link rel="self" type="application/atom+xml" href="https://manuais.iessanclemente.net/index.php?action=history&amp;feed=atom&amp;title=Curso_POO_PHP_Herdanza"/>
	<link rel="alternate" type="text/html" href="https://manuais.iessanclemente.net/index.php?title=Curso_POO_PHP_Herdanza&amp;action=history"/>
	<updated>2026-10-25T16:13:36Z</updated>
	<subtitle>Historial de revisiones de esta página en la wiki</subtitle>
	<generator>MediaWiki 1.46.2</generator>
	<entry>
		<id>https://manuais.iessanclemente.net/index.php?title=Curso_POO_PHP_Herdanza&amp;diff=36772&amp;oldid=prev</id>
		<title>Vlourido: /* Enlace estático en tempo de execución */</title>
		<link rel="alternate" type="text/html" href="https://manuais.iessanclemente.net/index.php?title=Curso_POO_PHP_Herdanza&amp;diff=36772&amp;oldid=prev"/>
		<updated>2013-08-01T11:34:06Z</updated>

		<summary type="html">&lt;p&gt;&lt;span class=&quot;autocomment&quot;&gt;Enlace estático en tempo de execución&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Página nueva&lt;/b&gt;&lt;/p&gt;&lt;div&gt;== Herdanza ==&lt;br /&gt;
&lt;br /&gt;
A [http://www.php.net/manual/es/language.oop5.inheritance.php herdanza] é un mecanismo da POO que nos permite definir novas clases sobre a base doutra xa existente. As novas clases que herdan coñécense tamén co nome de subclases. A clase da que herdan chámase clase base ou superclase.&lt;br /&gt;
&lt;br /&gt;
Por exemplo, podemos crear unha clase base chamada Produto, con algúns atributos e un método que xera unha saída personalizada en formato HTML do código.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
class Produto {&lt;br /&gt;
    public $codigo;&lt;br /&gt;
    public $nome;&lt;br /&gt;
    public $nome_corto;&lt;br /&gt;
    public $PVP;&lt;br /&gt;
        &lt;br /&gt;
    public function mostra_codigo() {&lt;br /&gt;
        print &amp;quot;&amp;lt;p&amp;gt;&amp;quot; . $this-&amp;gt;codigo . &amp;quot;&amp;lt;/p&amp;gt;&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Esta clase é moi útil se a única información que temos dos distintos produtos é a que se mostra arriba. Pero, se queres personalizar a información que vas tratar de cada tipo de produto (e almacenar, por exemplo para os televisores, as polgadas que teñen ou a súa tecnoloxía de fabricación), podes crear novas clases que herden de Producto. Por exemplo, TV, Ordenador, Movil.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
class TV extends Produto {&lt;br /&gt;
    public $polgadas;&lt;br /&gt;
    public $tecnoloxia;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Como podes ver, para definir unha clase que herde doutra, simplemente tes que utilizar a palabra &amp;#039;&amp;#039;&amp;#039;[http://www.php.net/manual/es/keyword.extends.php extends]&amp;#039;&amp;#039;&amp;#039; indicando a superclase. Os novos obxectos que se instancien a partir da subclase son tamén obxectos da clase base; pódese comprobar utilizando o operador &amp;#039;&amp;#039;&amp;#039;instanceof&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
$t = new TV();&lt;br /&gt;
if ($t instanceof Produto) {&lt;br /&gt;
	// A condición é certa&lt;br /&gt;
	…&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nas clases herdadas podes definir un novo construtor que redefina o comportamento do que existe na clase base, tal e como farías con calquera outro método. E dependendo de se programas ou non o construtor na clase herdada, se chamará ou non automaticamente ao construtor da clase base.&lt;br /&gt;
&lt;br /&gt;
En PHP5, se a clase herdada non ten construtor propio, chamarase automaticamente o construtor da clase base (se existe). Non obstante, se a clase herdada define o seu propio construtor, deberás ser ti que realice a chamada ao construtor da clase base se o consideras necesario, utilizando para iso a palabra &amp;#039;&amp;#039;&amp;#039;parent&amp;#039;&amp;#039;&amp;#039; e o operador de resolución de ámbito.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
class TV extends Produto {&lt;br /&gt;
    ...&lt;br /&gt;
    public function __construct($row) {&lt;br /&gt;
        parent::__construct($row);&lt;br /&gt;
        $this-&amp;gt;polgadas = $row[&amp;#039;polgadas&amp;#039;];&lt;br /&gt;
        $this-&amp;gt;tecnoloxia = $row[&amp;#039;tecnoloxia&amp;#039;];&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A palabra parent fai referencia á clase pai, e emprégase para facer referencia aos métodos orixinais que foron redefinidos na clase filla, como o construtor no exemplo anterior.&lt;br /&gt;
&lt;br /&gt;
=== Herdanza e visibilidade ===&lt;br /&gt;
&lt;br /&gt;
Como vimos cando falamos da [[Curso_POO_PHP_Definición_de_clases|definición de clases]], os membros dunha clase poden ter tres tipos de visibilidade: public, private e protected.&lt;br /&gt;
&lt;br /&gt;
Ademais das diferenzas no acceso aos membros segundo a súa visibilidade, esta tamén afecta á herdanza. Os membros privados dunha clase non están dispoñibles nas clases que herdan desta. Para crear un membro de acceso restrinxido (como os private) e herdable, débese declarar como &amp;#039;&amp;#039;&amp;#039;protected&amp;#039;&amp;#039;&amp;#039;. Os membros protected dunha clase hérdanse ao igual que os públicos e o acceso aos mesmos restrínxese aos propios membros da clase da mesma forma que sucede co acceso aos membros privados.&lt;br /&gt;
&lt;br /&gt;
=== Enlace estático en tempo de execución ===&lt;br /&gt;
&lt;br /&gt;
Consideremos o que acontece cando herdamos dunha clase que contén un método estático, como no noso exemplo.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
class Produto {&lt;br /&gt;
    public static function novoProduto() {&lt;br /&gt;
        self::$num_produtos++;&lt;br /&gt;
    }&lt;br /&gt;
    …&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
class TV extends Produto {&lt;br /&gt;
    private static $num_produtos = 0; &lt;br /&gt;
    …&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
class Ordenador extends Produto {&lt;br /&gt;
    private static $num_produtos = 0; &lt;br /&gt;
    …&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O que pretendemos coa herdanza é empregar un mesmo método &amp;#039;&amp;#039;novoProduto&amp;#039;&amp;#039; que conte os números dos artigos de cada unha das clases, de xeito que cando fagamos:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
TV()::novoProduto();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
engada 1 á variable &amp;#039;&amp;#039;$num_produtos&amp;#039;&amp;#039; da clase TV, e cando fagamos:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
Ordenador::novoProduto();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
engada 1 á variable &amp;#039;&amp;#039;$num_produtos&amp;#039;&amp;#039; da clase Ordenador.&lt;br /&gt;
&lt;br /&gt;
Non obstante o código anterior non funciona como esperamos, pois ao compilar encontra no método &amp;#039;&amp;#039;novoProduto&amp;#039;&amp;#039; unha referencia a &amp;#039;&amp;#039;&amp;#039;self::$num_produtos&amp;#039;&amp;#039;&amp;#039;, e intenta enlazar con unha variable da clase a que pertence (&amp;#039;&amp;#039;Produto&amp;#039;&amp;#039;) que non existe.&lt;br /&gt;
&lt;br /&gt;
Para solventalo temos que indicar a PHP que enlace coa variable en tempo de execución, non en tempo de compilación, e empregue as propiedades da clase que fai a chamada ao método. Isto faise empregando a palabra &amp;#039;&amp;#039;&amp;#039;static&amp;#039;&amp;#039;&amp;#039; no canto de &amp;#039;&amp;#039;self&amp;#039;&amp;#039; co operador de resolución de ámbito &amp;#039;&amp;#039;&amp;#039;::&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
Tamén teremos que definir as propiedades &amp;#039;&amp;#039;num_produtos&amp;#039;&amp;#039; como &amp;#039;&amp;#039;protected&amp;#039;&amp;#039; para darlles acceso dende o método herdado. Isto é:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
class Produto {&lt;br /&gt;
    public static function novoProduto() {&lt;br /&gt;
        static::$num_produtos++;&lt;br /&gt;
    }&lt;br /&gt;
    …&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
class TV extends Produto {&lt;br /&gt;
    protected static $num_produtos = 0; &lt;br /&gt;
    …&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
class Ordenador extends Produto {&lt;br /&gt;
    protected static $num_produtos = 0; &lt;br /&gt;
    …&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O mesmo acontece cando temos que acceder ao nome da clase. Se empregamos &amp;#039;&amp;#039;__CLASS__&amp;#039;&amp;#039; dende o método &amp;#039;&amp;#039;novoProduto&amp;#039;&amp;#039; devolveranos &amp;#039;&amp;#039;&amp;quot;Produto&amp;quot;&amp;#039;&amp;#039;. Para obter en tempo de execución o nome da clase que fai a chamada teremos que empregar a función &amp;#039;&amp;#039;&amp;#039;[http://es1.php.net/manual/es/function.get-called-class.php get_called_class]&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
Outra forma de arranxar o problema da herdanza de métodos estáticos é emprengando &amp;#039;&amp;#039;[[Curso_POO_PHP_Trazos|trazos]]&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
=== Funcións relacionadas coa herdanza ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Función !! Significado&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;[http://es1.php.net/manual/es/function.get-parent-class.php get_parent_class]&amp;#039;&amp;#039;&amp;#039; || Devolve o nome da clase pai do obxecto ou a clase que se indica&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;[http://es1.php.net/manual/es/function.is-subclass-of.php is_subclass_of]&amp;#039;&amp;#039;&amp;#039; || Devolve true se o obxecto ou a clase do primeiro parámetro, ten como clase base á que se indica no segundo parámetro, ou false no caso contrario&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
--[[Usuario:Vlourido|Víctor Lourido]] 14:08 28 jun 2013 (CEST)&lt;/div&gt;</summary>
		<author><name>Vlourido</name></author>
	</entry>
</feed>