tipos que poo multiple metodos herencia example ejemplos clases php inheritance properties traits redefinition

que - Rasgos de PHP: cambiar el valor de la propiedad estática en la clase heredada



que es un constructor en php (2)

Entonces, este es mi rasgo:

trait Cacheable { protected static $isCacheEnabled = false; protected static $cacheExpirationTime = null; public static function isCacheEnabled() { return static::$isCacheEnabled && Cache::isEnabled(); } public static function getCacheExpirationTime() { return static::$cacheExpirationTime; } }

Esta es la clase base:

abstract class BaseClass extends SomeOtherBaseClass { use Cacheable; ... }

Estas son mis 2 clases finales:

class Class1 extends BaseClass { ... } class Class2 extends BaseClass { protected static $isCacheEnabled = true; protected static $cacheExpirationTime = 3600; ... }

Aquí está la parte del código que ejecuta estas clases:

function baseClassRunner($baseClassName) { ... $output = null; if ($baseClassName::isCacheEnabled()) { $output = Cache::getInstance()->get(''the_key''); } if ($output === null) { $baseClass = new $baseClassName(); $output = $baseClass->getOutput(); if ($baseClassName::isCacheEnabled()) { Cache::getInstance()->set(''the_key'', $output); } } ... }

Este código no funciona porque PHP se queja de definir las mismas propiedades en Class2 que en Cacheable. No puedo configurarlos en sus constructores porque quiero leerlos incluso antes de ejecutar el constructor. Estoy abierto a las ideas, cualquier ayuda sería apreciada. :)

EDITAR:

Bueno, uso este rasgo Cacheable en varios lugares, así que me confundí. :) Esto funciona bien así. Pero tengo otra clase que usa directamente el rasgo Cacheable y cuando trato de hacer esto en esa clase, obtengo el error mencionado. Entonces ... Solo asuma que BaseClass no es abstracto y estoy tratando de establecer estas propiedades de caché en él. La pregunta sigue siendo la misma.


No puede reasignar propiedades de rasgo.

Desde PHP manual http://php.net/traits

Vea el Ejemplo # 12 Resolución de Conflictos

Si un rasgo define una propiedad, una clase no puede definir una propiedad con el mismo nombre; de ​​lo contrario, se emite un error. Es un E_STRICT si la definición de la clase es compatible (la misma visibilidad y el valor inicial) o de lo contrario es un error fatal.

Una solución sería definir las propiedades de anulación en la clase

class Class2 extends BaseClass { protected static $_isCacheEnabled = true; protected static $_cacheExpirationTime = 3600; ... }

y luego modifica tu rasgo como tal ...

trait Cacheable { protected static $isCacheEnabled = false; protected static $cacheExpirationTime = null; public static function isCacheEnabled() { if ( Cache::isEnabled() ) { return isset( static::$_isCacheEnabled ) ? static::$_isCacheEnabled : static::$isCacheEnabled; } else { return false; } } public static function getCacheExpirationTime() { return isset ( static::$_cacheExpirationTime ) ? static::$_cacheExpirationTime : static::$cacheExpirationTime; } }


Puede usar defined ():

// only defined in classes // static $isCacheEnabled = false; public static function isCacheEnabled() { return defined(static::$isCacheEnabled ) ? static::$isCacheEnabled : false; }

¿O tal vez podrías vivir con la variable protegida en lugar de estática?