2010-05-02 24 views
10

Según entiendo, es necesario pegar el código en el archivo php que realiza la llamada.php requiere una llamada de clase desde el método interior

¿Qué sucede si requirieras desde dentro de un método ... pegaría todo el código/clase dentro del método, bloqueando la siguiente instrucción en el método.

por ejemplo.

function test() { 

    require 'pathtosomeclasscode'; 
    somestatement; // any code after the require is blocked. 

} 

¿Cómo consigo alrededor de esto, para poder exigir código donde quiera, sin que se pega en ese punto exacto?

+0

¿Por qué bloquearía la siguiente afirmación? – zneak

+0

pondrá todo el código fuera de forma, por ejemplo. la clase que se está pegando dentro de la función –

+1

@jera: Eso no es lo que sucede. He dicho esto en mi respuesta, pero lo reforzaré aquí: ¿hay algún error/mal funcionamiento que esté experimentando que lo haga creer que este es el caso? Si es así, proporcione más detalles para que podamos rectificar el origen del problema. – icio

Respuesta

17

Sorprendentemente, parece que funciona bien. El código incluido se ejecutará dentro del alcance de Baz :: bork() - pero el código simplemente define una clase, y las clases son globales. Entonces terminas con una clase definida.

del archivo: foo.php:

<?PHP 
class Foo{ 
     function bar(){ 
       echo "Hello from Foo::bar()!\n"; 
     } 
} 

del archivo: Baz.php:

<?PHP 
class Baz{ 

     function bork(){ 
       require_once "Foo.php"; 
       $f = new Foo(); 
      $f->bar(); 
     } 
} 

echo "testing internal definition:\n"; 
$b = new Baz(); 
$b->bork(); 

echo "\ntesting in global scope:\n"; 

$f = new Foo(); 
$f->bar(); 
echo "\nall done\n"; 

Salida:

$ php Baz.php 
testing internal definition: 
Hello from Foo::bar()! 

testing in global scope: 
Hello from Foo::bar()! 

all done 

Ahora, no puedo pensar en muchos lugares donde querrías hacer las cosas de esta manera. Las personas suelen requerir_unce() cualquier posible dependencia en la parte superior de su archivo de clase, fuera de la definición de la clase.

+0

Esto puede ser útil cuando el archivo requerido es variable: 'require_once $ dirName. "/../{$ fileName} .php"; ' –

+0

¿Qué pasa si el archivo también especifica un espacio de nombres, lo manejará correctamente? Sí, funcionó. – SiXoS

+0

@JamesPoulson Esto también es útil para la carga condicional/retrasada de código. P.ej. un complemento de WordPress puede tener un código que solo se usa en la página frontend/backend/ajax/página específica, etc. Como los complementos se cargan antes de saber en qué página/publicación estás, necesitas retrasar la carga que en wp se realiza con acciones. que llamará sí, una función ... Esto puede acelerar las cosas en el lado del servidor, pero también evitar cargar estilos y scripts innecesarios reduciendo las solicitudes innecesarias ... – nus

1

intente require_once? Solo en caso de que lo incluyas en otro lugar.

0

Si usa include_once ('script.php') no se encontrará con errores sobre las clases que se vuelven a declarar.

No he probado a mí mismo la siguiente, pero estoy pensando en esta configuración también podría funcionar si no desea include_once() de forma redundante:

class Whatever { 

    protected $classObject; 
    public function __construct(/*...*/) { 
     include('anotherClass.php'); 
     $this->classObject = new anotherClass(); 
    } 

    public function someFunction(/*...*/) { 
     $this->classObject->classObjectFunction(); 
    } 

    public function anotherFunction(/*...*/) { 
     $this->classObject->classObjectFunction(); 
    } 
} 

A continuación, puede llamar al siguiente código cuales que cada llamada a una función en el mismo objeto de clase compartida:

$Whatever = new Whatever(); 
$Whatever->someFunction(); 
$Whatever->anotherFunction(); 
5

Calling require, require_once, include o include_onceno lo hará parada la ejecución del código dentro de su función a menos que haya un problema con el script incluido. El código dentro del archivo incluido se ejecuta en el mismo ámbito como la función (con funciones y clases definidas como globales), no insertada en ella, reemplazando a lo demás.

Las otras respuestas recomiendan usar una de las alternativas a require como solución: estas soluciones pueden funcionar si el error en sus scripts tiene que ver con un conflicto al nombrar (es decir, un intento de redefinir una clase o función) De lo contrario, es posible que desee proporcionarnos más detalles de lo que ha ocurrido (o no) para hacerle pensar que hay un problema para que podamos ayudarlo a resolver la verdadera causa.

En una nota adicional, estos métodos de inclusión de archivos no pegan el código en su secuencia de comandos. Pegando es una herramienta que la gente usa para mantener el texto. Le sugiero que lea el manual de PHP para tratar de avanzar en su comprensión de cómo funcionan estas funciones:

post de nuevo si' Tengo más preguntas sobre su funcionamiento después de investigarlos.

0

Creo que lo que dices es que no quieres que el código se ejecute de inmediato. Si eso es correcto, tiene varias opciones:

  1. Puede mover la necesita.

  2. También puede leer el archivo usando fopen(), luego analizarlo. (No se puede llamar a eval, ya que no va a entender el código HTML, pero se puede hacer con un analizador)

0

Tal como lo veo, usted está utilizando archivos externos para las clases de carga, Estoy en lo correcto? ¿Por qué no usas Autoloading Classes? Sé que no funcionará cuando quieras cargar diferentes cuerpos de clase en diferentes circunstancias, pero realmente no sé si es una buena práctica.

Cuestiones relacionadas