2010-02-28 22 views
6

Al extender las clases en Java, la ambigüedad del nombre de clase se evita mediante el uso de nombres de paquetes calificados en las instrucciones de importación.Ampliación de clases en PHP

Por ejemplo: Supongamos que quiero que mi controlador extienda el MultiActionController de Spring: lo importaré del paquete estándar de Spring. Esto también me impide extender el MultiActionController de Mike o Perry, ya que no he importado MultiActionController de sus paquetes.

De manera similar en PHP, digamos que tenemos 10 clases en 10 carpetas de bibliotecas diferentes, todas las cuales se llaman MultiActionController.

cuando escribo:

class MyController extends MultiActionController { 
    function __construct() { 
     parent::__construct(); 
    } 
} 

¿Cómo le digo PHP que MultiActionController (de qué carpeta), que se extiende desde?

+0

¿hay una razón por la que su limitada a PHP4? Si usa PHP5 y la versión 5.3 o superior, obtendrá ejemplos mucho mejores con espacios de nombres. –

+0

No lo soy. Así que automáticamente lo puse, no sé por qué. Estoy en PHP 5.2.8 (eso es lo que mi anfitrión está ofreciendo). –

+0

He editado su pregunta para eliminar la etiqueta "php4", y la he reemplazado por "php5", así que las cosas están claras :-) –

Respuesta

1

PHP ampliará la clase que incluyó con una instrucción include.

Por ejemplo, digamos que usted tiene un foo clase declarada en Bar.php archivo:

class Foo { 
    // methods and fields 
} 

Luego, en otra fie:

include 'bar.php'; 
class Aardvark extends Foo { 
    // this class will extend the class Foo in file bar.php 
} 
+0

Gracias, qué idiota he sido. –

2

Depende cuál se incluye. PHP no le permitirá volver a definir una clase del mismo nombre, por lo que sólo incluye por encima de la definición de clase (modificar para adaptarse a los nombres de los archivos y su diseño de software):

include('../includes/Spring/MultiActionController.php'); 

class MyController extends MultiActionController { 
    .... 
} 
+0

Gracias, qué idiota he sido. ;) –

1

Usted tiene que incluir el archivo de la celebración de la clase, con un banal include() declaración:

include('lib/controllers/MultiAction.php'); 

a continuación, puede extenderlo!

+0

Gracias, qué idiota he sido. –

+0

¡Todos deben aprender! Por cierto, deberías leer sobre la diferencia entre 'include()', 'require()' y 'require_once()'! include() arrojará un error no fatal si falta el archivo php, require() actúa de la misma manera pero con un error fatal, y require_once evita que el archivo php sea invocado varias veces desde diferentes scripts. Puede verificar aquí => http://it.php.net/require_once –

7

Tener varias clases con el mismo nombre, un día u otro, causará algunos problemas: no se pueden incluir dos clases con el mismo nombre durante la ejecución de un script - Te conseguirá un error fatal.

Lo que generalmente se hace, en PHP (antes de PHP 5.3 y espacios de nombres, al menos) es incluir el nombre de la biblioteca y/o el "paquete" en el nombre de la clase.

Por ejemplo, podría tener un nombre de clase MyLibrary_Package_MultiActionController, y otro llamado OtherLib_Blah_MultiActionController.


Entonces, ¿qué hace generalmente está usando ese nombre de la clase de "mapa" a los directorios y archivos, en sustitución del '_' por '/', y añadiendo .php al final del último nivel - este ser a menudo se hace usando el autoloading feature of PHP, para evitar tener que escribir una enorme cantidad de directivas require.

Por ejemplo, una clase llamada MyLibrary_Package_MultiActionController debe almacenarse en MyLibrary/Package/MultiActionController.php.


Como nota al margen: usted utilizó la etiqueta "php4", en su pregunta ...Si realmente está usando PHP 4, no debe olvidar que es viejo, no se mantiene más (ni siquiera para problemas de seguridad), ¡y que PHP 5 es realmente el camino a seguir!

De hecho, no podrá hacer mucho acerca de la programación orientada a objetos, con PHP 4; el material orientado a objetos en PHP 4 fue muy básico ...

(cosas tales como la auto-carga, sobre la que escribí un par de párrafo anteriores no existe en PHP 4 - mismo para public/private/protected , y un montón de otras cosas relacionadas con OO-...)

+0

Thx para la respuesta. Estoy en PHP 5.2.8 (ver mi respuesta arriba). –

+0

OK sobre PHP 5.2 vs PHP 4: son buenas noticias :-) –

0

me gustaría utilizar namaspaces

namespace package_products_multicontroller { 
include("/packages/products/multicontroller.php"); 
} 

class MyController extends package_products_multicontroller\MultiActionController { 
    function __construct() { 
     parent::__construct(); 
    } 
} 
+0

Esta parece ser la manera más clara (léase: "más inequívoca") (aunque es un poco prolija, si me atrevo a decir eso). –