Contactos

Miembros de la clase estática. No les dé a arruinar su código. Métodos STATIC PHP PRIMSEL STATIC PHP P

No es un secreto que le encanta hacer preguntas difíciles en las entrevistas. No siempre es adecuado, no siempre relacionado con la realidad, pero el hecho sigue siendo un hecho, pregunta. Por supuesto, la pregunta es un problema, y \u200b\u200ba veces la pregunta, a primera vista, aparentemente estúpida, en realidad está dirigida a comprobar lo bien que sabe el idioma que escribe.

Intentemos desmontar "hueso" una de estas preguntas. ¿Qué significa la palabra "estática" en PHP y por qué se aplica?

La palabra clave estática tiene tres valores diferentes en PHP. Los analizaremos en orden cronológico, como aparecieron en el idioma.

El primer valor es una variable local estática.

Función FOO () ($ A \u003d 0; echo $ A; $ A \u003d $ A + 1;) Foo (); // 0 foo (); // 0 foo (); // 0.

En las variables PHP locales. Esto significa que la variable definida y el valor dentro de la función (método) existe solo durante la ejecución de esta función (método). Al salir del método, la variable local se destruye, y cuando se reingresa, se procedió. En el código anterior, tal variable local es $ una variable, existe solo dentro de la función FOO () y cada vez que llame a esta función está prohibida. El incremento de la variable en este Código no tiene sentido, porque en la próxima misma línea del Código, la función terminará su funcionamiento y se perderá el valor de la variable. ¿Cuántas veces no causamos la función FOO (), siempre tomará 0 ...

Sin embargo, todo cambia, si ponemos la palabra clave estática antes de asignar:

Función FOO () (estática $ A \u003d 0; echo $ A; $ A \u003d $ A + 1;) Foo (); // 0 foo (); // 1 foo (); // 2.

La palabra clave estática Escrita antes de asignar el valor de la variable local conduce a los siguientes efectos:

  1. La asignación se realiza solo una vez, cuando primero llama la función
  2. El valor marcado de esta manera se guarda una variable después de que se complete la operación.
  3. Con las llamadas de función subsiguientes, en lugar de la asignación, la variable recibe el valor guardado previamente
Tal uso de la palabra estática se llama variable local estática.
Piedras estáticas de la variable estática
Por supuesto, como siempre en PHP, no cuesta sin "Pitfalls".

La piedra es la primera variable estática para asignar solo constantes o expresiones constantes. Aquí está el código:
Estático $ A \u003d Barra ();
Con inevitabilidad conducirá a un error de analizador. Afortunadamente, comenzando con la versión 5.6, se dejó permisible asignar no solo constantes, sino también expresiones constantes (por ejemplo, "1 + 2" o ""), es decir, tales expresiones que no dependen del otro código y pueden ser calculado en la etapa de compilación

Segundo de piedra: los métodos existen en una sola copia.
Todo es más complicado aquí. Para entender la esencia, daré el código:
Clase A (función pública foo () (estática $ x \u003d 0; echo ++ $ x;)) $ A1 \u003d nuevo A; $ a2 \u003d nuevo a; $ a1-\u003e foo (); // 1 $ A2-\u003e FOO (); // 2 $ A1-\u003e FOO (); // 3 $ A2-\u003e FOO (); // cuatro
Contrariamente a la espera intuitiva de "objetos diferentes, métodos diferentes", vamos visualmente este ejemplo que los métodos dinámicos en PHP "no se multiplican". Incluso si tenemos cien objetos de esta clase, el método existirá solo en una instancia, solo con cada llamada a ella se acuñará diferente $ de esto.

Dicho comportamiento puede ser inesperado para el desarrollador no está preparado para ello y servir como fuente de errores. Cabe señalar que la herencia de la clase (y el método) conduce al hecho de que se crea un nuevo método:

Clase A (función pública foo () (estática $ x \u003d 0; echo ++ $ x;)) Clase B extiende A () $ A1 \u003d nuevo A; $ b1 \u003d new b; $ a1-\u003e foo (); // 1 $ b1-\u003e foo (); // 1 $ a1-\u003e foo (); // 2 $ b1-\u003e foo (); // 2.

Conclusión: existen métodos dinámicos en PHP en el contexto de las clases, no los objetos. Y solo en el rango de clasificación hay una sustitución "$ esto \u003d current_object"

Significado de segundas propiedades y métodos de clase

En el modelo de objeto PHP, es posible establecer propiedades y métodos no solo para los objetos: instancias de clase, sino también para una clase en su conjunto. Para ello, también sirve a la palabra clave estática:

Clase A (público estático $ x \u003d "foo"; prueba de función estática pública () (return 42;)) ECHO A: $ X; // "foo" eco a :: prueba (); // 42.
Para acceder a dichas propiedades y métodos, se utilizan estructuras con doble colon ("Paamayim nekudotayim"), como el nombre_nombre :: $ PROPÓSITO Y NAME_NAME :: Namemode ().

No hace falta decir que las propiedades estáticas y los métodos estáticos tienen sus propias características y sus "escollos" que necesitas saber.

La característica es la primera, banal, no $ esto. De hecho, esto se deriva de la definición de la definición del método estático, ya que está asociado con la clase, y no es un objeto, no está disponible para la pseudo-temperatura $ esto, lo que indica en métodos dinámicos al objeto actual. Lo que es completamente lógico.

Sin embargo, debe saber que, en contraste con otros idiomas, PHP no define la situación "en el método estático, se escribe $ esto" en la etapa de análisis o compilación. Un error similar puede ocurrir solo en RABIRIONE si intenta realizar un código con $ este dentro del método estático.

Código de tipo tal:
Clase A (Public $ ID \u003d 42; Función pública estática FOO () (Echo $ esto-\u003e ID;))
No llevará a ningún error, siempre que no intente usar el método FOO () de la manera inadecuada:
$ a \u003d nuevo a; $ a-\u003e foo (); (e inmediatamente obtenga "ERROR FATAL: usando $ esto cuando no esté en el contexto del objeto")

Característica dos - estática no es un axioma!
Clase A (Función pública estática FOO () (ECHO 42;)) $ A \u003d Nuevo A; $ a-\u003e foo ();
Me gusta esto, sí. Método estático, si no contiene en código $, es posible llamar en un contexto dinámico como método de objeto. Esto no es un error en PHP.

Lo contrario no es del todo cierto:
Clase A (función pública foo () (eco 42;)) a :: foo ();
Un método dinámico que no utiliza $ esto se puede realizar en un contexto estático. Sin embargo, recibirá una advertencia "Método no estático A :: Foo () no debe llamarse estáticamente" E_strict Level. Allí para resolverlo, o seguir estrictamente los estándares del código, o suprimir las advertencias. El primero, por supuesto, es preferible.

Y por cierto, todo lo que se escribe anteriormente se aplica solo a los métodos. El uso de propiedades estáticas a través de "-\u003e" es imposible y conduce a un error fatal.

El valor es el tercero, aparente la unión estática más difícil, posterior.

Los desarrolladores del lenguaje PHP no se detuvieron en los dos valores de la palabra clave "estática" y en la versión 5.3 agregó otro idioma "Función", que se implementa con la misma palabra. Se llama "Encuadernación estática posterior" o LSB (unión estática tardía).

Comprender la esencia de LSB es la forma más fácil de ser ejemplos simples:

Modelo de clase (estadística pública $ Table \u003d "Tabla"; Función estática pública GetTable () (devolución, auto :: $ TABLA;)) Modelo ECHO :: GetTable (); // "Mesa"
La palabra clave Self en PHP siempre significa "Nombre de la clase, donde esta palabra está escrita". En este caso, el yo es reemplazado por la clase de modelo, y auto :: $ Tabla - en el modelo :: $ TABLA.
Tal posibilidad de idioma se llama "unión estática temprana". ¿Por qué temprano? Debido a que la unión del yo y el nombre específico de la clase no están ocurriendo en el ranking, pero en etapas anteriores: análisis y compilación del código. Bueno, "estático", porque estamos hablando de propiedades y métodos estáticos.

Cambie ligeramente nuestro código:

Modelo de clase (estadística pública $ Table \u003d "Tabla"; Función estática pública GetTable () (retorno mismo :: $ la tabla;)) El usuario de la clase extiende el modelo (público estático $ Table \u003d "Usuarios";) Echo User :: GetTable () ; // "Mesa"

Ahora entiendes por qué PHP se comporta en esta situación de manera no juisiva. El yo se asoció con la clase modelo cuando la clase de usuario aún no se ha conocido, por lo tanto, indica el modelo.

¿Cómo ser?

Para resolver este dilema, se inventó el mecanismo de unión "tardío", en la etapa de rango. Funciona muy simplemente, suficiente en lugar de la palabra "auto" escritura "estática" y la conexión se instalará con la clase que causa este código, y no con dónde se escribe:
Modelo de clase (estadística pública $ Table \u003d "Tabla"; Función estática pública GetTable () (devolución estática :: $ la tabla;)) El usuario de la clase extiende el modelo (público estático $ Table \u003d "Usuarios";) Echo User :: GetTable () ; // "Usuarios"

Esta es una misteriosa "una vinculación estática posterior".

Cabe señalar que para mayor comodidad en PHP, excepto por la palabra "estática", todavía hay una función especial get_called_class (), que le informará, en el contexto de qué clase se encuentra actualmente su código.

¡Entrevistas exitosas!



Hay dos variedades de desarrolladores de PHP en el mundo. Algunos prefieren los métodos estáticos, porque es fácil trabajar con ellos, otros, por el contrario, considerar métodos estáticos: el mal y no los usan en su práctica.
En este artículo, intentaré usar la experiencia con varios marcos, para explicar por qué algunos desarrolladores ignoran las mejores prácticas y usan un montón de métodos estáticos.

¿Quién ama los métodos estáticos?

Especialmente a menudo usan desarrolladores que se han utilizado en su marco de trabajo CodeIgniter.

Además, los seguidores de los métodos estadísticos incluyen la mayoría de los desarrolladores de Kohana y Laravel.
Es imposible no mencionar el hecho de que los programadores que deciden comenzar a escribir sus propias cosas generalmente se niegan a usar CodeIgNITER.

¿Por qué preguntas?

CodeIgniter admitido PHP 4 Antes de que se agregaron métodos estáticos a PHP 5. Además, CodeIgniter utiliza un "objeto súper", que proporciona una igualdad de acceso a todas las clases asignadas al controlador. Por lo tanto, se vuelven accesibles para usar en todo el sistema.

Esto significa que las clases pueden estar disponibles en cualquier modelo utilizando el método __Get (), que buscará la propiedad solicitada utilizando get_instance () -\u003e ($ var). Anteriormente, cuando el soporte para la función __ obtenga () no estaba en PHP 4, ya que se usó el diseño forache a través de los parámetros CI_Controller, y luego se asignaron a la $ esta variable en el modelo.

En la biblioteca debe llamar a get_instancia. La biblioteca no hereda una clase en un orden obligatorio, por lo que no hay forma de evitar la función __GET ().

Volumen ...

Resulta un diseño bastante engorroso para acceder al código. Exactamente se puede lograr la misma funcionalidad sin esfuerzos adicionales utilizando un método estático.

Sí, y no hay ningún sentido particular para discutir sobre tal diseño. Bueno, puede acceder a los datos de la sesión en su modelo. Pero, ¿por qué necesitas hacer esto?

"Decisión"

Los desarrolladores de Kohana fueron los primeros en trabajar seriamente sobre métodos estáticos. Hicieron los siguientes cambios:
// fue $ esto-\u003e Entrada-\u003e Obtener ("foo"); // se convirtió en entrada :: Obtener ("foo");
Para muchos desarrolladores de CodeIgniter con su PHP 4 obsoletos, que se mudaron al marco Kohana para disfrutar de todos los encantos PHP 5, no hay nada inusual en esto. Pero, los menos personajes, mejor, ¿verdad?

¿Y cuál es el problema?

Muchos desarrolladores de PHP (especialmente aquellos que entienden el Symfony y Zend) dirán: "¡Es obvio: use la introducción de dependencias!" Pero no muchos desarrolladores en la comunidad de Codeigniter tienen experiencia real con este proceso, ya que es bastante complicado.

Otro hecho sobre el marco de combustible PHP sigue siendo principalmente métodos estáticos, actúan como una interfaz. Por ejemplo, la lógica todavía tiene problemas con estática, especialmente cuando se activa el concepto HMVC.

Este es un pseudocódigo que no utilicé en Fuelphp, comenzando con la versión 1.1:
Clase Controllera extiende el controlador (función pública Action_foo () (ECHO Entrada :: Obtener ("param");))
Código de bonito estándar. Este método emitirá el valor. Bar \u003d. en el método.

¿Qué sucede cuando hacemos una solicitud de HMVC a este método?
Controlador de clase extiende el controlador (entrada ECHO :: Obtener ("param"); \u200b\u200bEcho "Solicitud de eco" & "; echo Solicitud :: FORGE (" Controlera / Foo? Param \u003d Val1 ") -\u003e Ejecutar ();))
Llamando al navegador controlador / baz.Verá la salida "Val1", pero si obtiene controlador / baz? Param \u003d anularRecibirá ambos desafíos para obtener el método que devuelve el mismo valor.

Relevancia

El código global no le dará ninguna relación. Un ejemplo es mejor que cualquier palabra:
$ esto-\u003e Solicitud-\u003e Entrada-\u003e Obtener ("param");
El objeto solicitado contendrá una instancia completamente nueva para cada consulta, luego se creará la entrada del objeto para cada solicitud, que contiene solo datos de entrada para una consulta específica. Esto es cierto para que Fuelphp 2.0 planea trabajar y resuelve el problema de agregar dependencia, así como problemas con HMVC.

¿Cómo lidiar con la sintaxis bruta?

Los desarrolladores de Symfony o Zend no sufren tanto, pero aquellos que usan Codeigniter serán largas pesadillas sobre "Regreso a PHP 4".

$ Esto siempre se refiere al objeto "actual", y no es exactamente necesario usarlo para acceder al código global.

$ esto-\u003e Solicitud-\u003e Entrada-\u003e Obtener () puede parecer un formulario alargado de sintaxis de CodeIgNITER, pero, de hecho, estamos simplemente en el controlador. Cuando el controlador crea una instancia de la nueva consulta insertada en ella, el constructor de consultas también recibe una instancia en la entrada.

Si está en un modelo u otra clase, entonces el acceso es el tipo de $ esta-\u003e Solicitud-\u003e Entrada-\u003e Foo () no funcionará, porque $ este no es el controlador.

Entrada :: Obtener diseño ("foo") crea una fachada para las instancias de lógica en el fondo. Pero esto no resuelve problemas relacionados con el trabajo del Código Global. Los perezosos cuando las aplicaciones de prueba pueden cambiar entre dos modos sin la necesidad de usar completamente el nuevo marco.

Hay un gran video de Taylor Obllá (Creador o Laravel 4) en el que describe cómo puede reemplazar el código estático con una sola instancia verificada a través de su contenedor DIC.

Laravel 4 - Controlador de IOC Inyección y pruebas de la unidad de UsersCape en Vimeo.

Esta es una excelente presentación de cómo puede prescindir de los métodos estáticos en Laravel. Aunque algunos marcos modernos, a primera vista, son muy recordados por Kohana, resuelven absolutamente las tareas más estándar de diferentes maneras.

En esta triste nota ...

Ahora estoy involucrado en la conversión de Pyrocms con CodeIgniter en Laravel. Estoy tratando de mudarme directamente desde el código global PHP 4 a la implementación perfecta de las dependencias es el suicidio absoluto. Paso intermedio antes de usar el cargador de arranque CI: el uso de PHP 5, código PSR-2 cargado automático con un montón de métodos estáticos. Bueno, mientras todavía estamos en Codeigniter.

La transición de la estática al código DIC se puede mostrar fácilmente cuando finalmente hacemos la transición a Laravel.

La transición del código de Sublaink CodeIgniter a la prueba PSR-2 es la tarea principal. El equipo de Pyro ya está en camino, y será épico.

En PHP, es posible determinar el método como estático. El método estático no tiene acceso a las propiedades del objeto. Tales métodos solo pueden ser causados \u200b\u200ben el contexto de la clase, pero no en el contexto del objeto.

Lo más importante es comprender: las propiedades estáticas y los métodos son presentados por clases, no objetos.

El ejemplo se aclarará de inmediato. Vamos a crear un objeto matemático (abreviado por las matemáticas en inglés).

Métodos estáticos PHP.
"; $ Math_1 \u003d New Math (); $ math_2 \u003d New Math_2; $ Math_3 \u003d New Math_3; $ Math_4 \u003d New Math_4 \u003d New Math_4 \u003d New Math_4

Esta clase proporciona herramientas para trabajar con funciones matemáticas sin la necesidad de crear un objeto. La clase tiene un constructor que aumenta la propiedad estática de $ cuenta por unidad. La clase recuerda el valor de esta propiedad, ya que es estática.

Por cierto, la palabra estática palabra estática para declarar el método o la propiedad estática, y la palabra Self con un doble colon se usa para acceder a una propiedad estática "::".

Todo esto se entiende mejor en comparación, especialmente en comparar el ejemplo de trabajo con erróneo. Vamos a expandir ligeramente nuestro ejemplo.

Métodos estáticos PHP. contador ++; ) Cálculo de la función estática pública ($ X) (Retorno sin ($ x);) Función estática pública CALCSQRT ($ X) (return SQRT ($ X);) Función estática pública GetCount (devolución, auto :: $ cuenta;) Función pública Getcounter () (devuelva $ esta-\u003e contador;)) Echo Math :: Calcsin (1); Eco "
"Echo Matemáticas :: Calcsqrt (9); echo"
"; $ Math_1 \u003d New Math (); $ Math_2 \u003d New Math_2; $ Math_3 \u003d New Math_3 \u003d $ math_4 \u003d New Math_4 \u003d New Math_4
"; Echo" Objetos creados: "$ math_4-\u003e getcounter ();?\u003e

En este ejemplo, agregamos la clase de la propiedad de $ contrapunto habitual, también aumentó por uno en el constructor. Pero la propiedad habitual pertenece al objeto, por lo que no se salva entre los desafíos de los objetos. Con cualquier creación de una instancia de una clase (objeto), la propiedad será igual a Nulo, en el diseñador se incrementará por uno.

La propiedad estática pertenece a la clase, por lo que se guarda su valor.

A continuación se muestran algunos ejemplos más que revelan el trabajo de las propiedades y métodos estáticos.

Intentar usarlo en el método estático $ Esta variable resultará en un error (error fatal: usando $ esto cuando no esté en el contexto del objeto).

Métodos estáticos PHP. edad. "VIEJO."; // Este es un error "usando $ esto cuando no está en el contexto del objeto". )) $ Testclass \u003d nuevo testclass (); $ Testclass-\u003e Sayhello (); \u003e\u003e

Por cierto, sin una cadena:

$ Testclass-\u003e Sayhello ();

los errores no serán, pero tan pronto como intente iniciar el método estático de la variable $ esta variable, inmediatamente reciba un mensaje de error.

Si en este ejemplo, retire la palabra estática, entonces los errores no lo serán.

Si se refiere a la propiedad del objeto desde el método estático, resultará en un error. Puede aplicar solo a las propiedades estáticas usando el diseño de Author :: $ $. Tenga en cuenta que hay un signo de $ frente al nombre de la variable, a diferencia del diseño de $ este-\u003e edad.

Métodos estáticos PHP. di hola (); \u003e\u003e

Si en este ejemplo, retire la palabra estática delante del nombre de la propiedad, se producirá el error "Acceso a la propiedad estática no declarado".

Las propiedades estáticas están ausentes en los objetos de clase.

Métodos estáticos PHP. "; Print_r ($ testclass); echo""; ?>

El método estático se puede llamar usando el método Self :: Método (). Ejemplo:

Métodos estáticos PHP. printHello (); \u003e\u003e

La propiedad estática se puede obtener en el contexto de la clase utilizando la sintaxis:

echo TestClass :: $ EDAD;

Además, un intento de referirse a la propiedad habitual llevará a un error: "Error fatal: acceso a la propiedad estática no declarada".

La propiedad estática se puede cambiar en el contexto de la clase utilizando la sintaxis:

TESCLASS :: $ EDAD + \u003d 20; // p.ej

Otro ejemplo de código con métodos y propiedades estáticas.

En este ejemplo, opciones más simples para usar métodos y propiedades estáticas. El código más simple que entenderás, mejor recuerde el material.

Métodos estáticos PHP. ".Testclass :: $ Edad; // echo testclass :: $ txt; // ERROR: ERROR FATAL: Acceso a la propiedad estática no declarada. Echo"
"; Testclass :: Sayhi (); echo"
"TestClass :: Sayhello (); // y para que pueda acceder a una variable estática a través del objeto ($ OBJ :: $ EDAD) ... Echo"
"; $ obj \u003d nuevo testclass; echo", obtenemos un grado en una variable estática a través del objeto: ". $ obj :: $ edad;?\u003e

Nota, y esto es importante, en este ejemplo, nos dirigimos al método no estático de Sayhi () utilizando la sintaxis de acceso a elementos de clase estática.

Resumen

  • PRINCIPAL: Las propiedades estáticas pertenecen a clases, no objetos.
  • Desde el método estático, es imposible comunicarse con las propiedades y los métodos habituales de la clase, $ este-\u003e Nombre no funciona aquí.
  • Desde el método estático, puede referirse a las propiedades estáticas utilizando el nombre de sí mismo :: $.
  • Las propiedades de la clase estática no están disponibles para los objetos.
  • El método habitual puede referirse a una propiedad estática usando auto :: $ nombre.
  • La propiedad estática se puede obtener en el contexto de la clase utilizando Sintaxis: TestClass :: $ Edad.
  • El método habitual se puede llamar en el contexto y el objeto ($ objeto-\u003e método ()), y la clase utilizando la sintaxis de TestClass :: Método ().
  • Usando la sintaxis de $ Object :: $ EDAD, logré acceder a la propiedad estática a través del objeto.

Paralelo con javascript

JavaScript tiene una clase de matemáticas que contiene muchas funciones matemáticas diferentes.

Para llevar a cabo cálculos matemáticos (cálculo del seno o exhibición) en JavaScript, no es necesario crear un objeto de matemáticas de clase, ya que sus métodos son estáticos. Antes de estudiar PHP, no pude entender lo que era, y solo haber estudiado clases y objetos en PHP en mi cabeza, todo cayó sobre mis estantes.

De hecho, es muy conveniente, tiene acceso directo a los métodos matemáticos de la clase de matemáticas, evitando la creación de objetos.

Tengo mucho tiempo quería escribir sobre este tema. El primer shock fue el artículo MIŠKO, "Métodos estáticos son la muerte a la prueba". Escribí un artículo de respuesta, pero nunca lo publicaron. Pero recientemente vio algo que se puede llamar "programación orientada a la clase". Esto refrescó mi interés en el tema y aquí está el resultado.

"La programación orientada a la clase" es cuando se utilizan las clases que consisten solo en métodos estáticos y propiedades, y la instancia de clase nunca se crea. En este artículo, hablaré de:

  • no da ninguna ventaja en comparación con la programación de procedimientos.
  • no renunciar a los objetos
  • disponibilidad de miembros estáticos de la clase! \u003d Pruebas de muerte
Aunque este artículo sobre PHP, los conceptos se aplican a otros idiomas.

Dependencias

Por lo general, el código depende del otro código. Por ejemplo:

$ Foo \u003d substr ($ bar, 42);
Este código depende de la variable de $ bar y las funciones de los sunsgos. $ Bar es solo una variable local definida ligeramente más alta en el mismo archivo y en el mismo alcance. Substro es la función del kernel de PHP. Todo es simple aquí.

Ahora, tal ejemplo:

Clase BloomFilter (... función pública __Construct ($ M, $ K) (...) Función estática pública GETK ($ M, $ N) (Retorno CEIL ((($ M / $ N) * Log (2)) ;) ...)
Esta pequeña función auxiliar simplemente proporciona una envoltura para un algoritmo específico que ayuda a calcular un buen número para el argumento de $ K utilizado en el constructor. Porque Debe ser causado antes de crear una instancia de clase, debe ser estática. Este algoritmo no tiene dependencias externas y es poco probable que sea reemplazado. Se usa así:

$ m \u003d 10,000; $ n \u003d 2000; $ B \u003d Nuevo BloomFilter ($ M, Bloomfilter :: GETK ($ M, $ N));
No crea ninguna dependencia adicional. La clase depende de mí mismo.

  • Diseñador alternativo. Un buen ejemplo es la clase DateTime integrada en PHP. Su instancia se puede crear de dos maneras diferentes:

    $ Fecha \u003d Nuevo DateTime ("2012-11-04"); $ Fecha \u003d DateTime :: CreatefromFormat ("D-M-Y", "04-11-2012");
    En ambos casos, el resultado será una instancia de DateTime y, en ambos casos, el código está vinculado a la clase de DateTime One u otra. Método estático DateTime :: CreateFROMFOMAT es un objeto alternativo del objeto que devuelve el mismo que el nuevo DateTime, pero utilizando una funcionalidad adicional. Donde puedes escribir nueva clase, puedes escribir y clasificar :: Método (). No se producen nuevas dependencias.

  • El uso restante de los métodos estáticos afecta la unión y puede formar dependencias implícitas.

    Palabra sobre la abstracción

    ¿Por qué este descanso con las dependencias? Capacidad para abstractar! Con el crecimiento de su producto, crece su complejidad. Y la abstracción es la clave para la gestión de la complejidad.

    Por ejemplo, tiene una clase de aplicación, que presenta su solicitud. Se comunica con la clase de usuario, que es la prevención del usuario. Que recibe datos de la base de datos. Clase de base de datos necesita basatos de datos. DatabaseedRiver necesita configuraciones de conexión. Etc. Si simplemente llama a la aplicación:: Iniciar () estáticamente, lo que causará el usuario :: GetData () estáticamente, lo que causará la base de datos estáticamente, y así sucesivamente, con la esperanza de que cada capa se ocupe de sus dependencias, puede obtener Un terrible desastre si algo no va así. Es imposible adivinar si la aplicación :: Iniciar () la llamada funcionará, ya que no es obvio de cómo se comportarán las dependencias internas. Es aún peor que la única forma de influir en el comportamiento de la aplicación :: Iniciar () es cambiar el código fuente de esta clase y el código de clase que llama y el código de clase que aparecen las clases ... en la casa ese conector construido.

    El enfoque más efectivo, al crear aplicaciones complejas, es la creación de partes individuales que pueden ser rechazadas en el futuro. Partes que se pueden dejar de pensar en las que puedes estar seguro. Por ejemplo, al llamar a la base de datos estática :: Fetchall (...), no hay garantías de que la conexión a la base de datos ya esté instalada o se instalará.

    Función (base de datos de base de datos) (...)
    Si se ejecuta el código dentro de esta función, esto significa que la instancia de la base de datos se ha transferido con éxito, lo que significa que la instancia del objeto de la base de datos se ha creado correctamente. Si la clase de base de datos está diseñada correctamente, puede estar seguro de que la presencia de una instancia de esta clase significa la capacidad de realizar solicitudes a la base de datos. Si la instancia de clase no es, el cuerpo de la función no se ejecutará. Esto significa que la función no debe hacerse cargo del estado de la base de datos, la clase de la base de datos lo hará él mismo. Este enfoque le permite olvidarse de las dependencias y concentrarse en resolver problemas.

    Sin la posibilidad, no piense en las dependencias y las dependencias de estas dependencias, es casi imposible escribir al menos una aplicación compleja. La base de datos puede ser una pequeña clase de envoltura o un monstruo de múltiples capas gigantes con un montón de dependencias, puede comenzar como una pequeña envoltura y mutarse en un monstruo gigante con el tiempo, puede heredar la clase de base de datos y la transferencia a la función descendiente, es No es todo importante para su función (base de datos de base de datos de base de datos), siempre y cuando la interfaz pública de la base de datos no cambie. Si sus clases están correctamente separadas de las otras partes de la aplicación mediante la implementación de dependencias, puede probar cada una de ellas utilizando los enchufes en lugar de sus dependencias. Cuando probó la clase suficiente para asegurarse de que funciona como debería, puede desechar más innecesario desde la cabeza, simplemente sabiendo que debe usar la instancia de la base de datos para trabajar con la base de datos.

    La programación orientada a la clase no tiene sentido. Aprende a usar OOP.

    REG.RU: Dominios y alojamiento

    El mayor grabador y proveedor de alojamiento en Rusia.

    Más de 2 millones de nombres de dominio para mantenimiento.

    Promoción, correo por un dominio, soluciones de negocios.

    Más de 700 mil clientes en todo el mundo ya han hecho su elección.

    * Sobre el ratón para suspender el desplazamiento.

    De vuelta atras

    Métodos estáticos y propiedades en PHP

    En materiales anteriores, dominamos las posibilidades principales de la programación orientada a objetos en PHP y ahora vamos al estudio de aspectos más complejos e interesantes.

    Antes de eso, siempre trabajamos con objetos. Describimos las clases como plantillas con las que se crean objetos, y los objetos, como componentes activos, los métodos de los cuales llamamos y cuyas propiedades obtenemos acceso.

    Desde aquí, siguió la conclusión de que en la programación orientada a objetos, el trabajo real se realiza utilizando instancias de clases. Y las clases en última instancia son solo plantillas para crear objetos.

    Pero de hecho, no todo es tan simple. Podemos acceder a ambos métodos y propiedades en el contexto de una clase, y no un objeto. Tales métodos y propiedades se denominan "estática" y deben anunciarse usando una palabra clave estático..

    Clase Staticexample (estático Public $ Anum \u003d 0; Función pública estática Sayhello () (¡Imprimir Hola! ";)

    Métodos estáticos - Estas son funciones utilizadas en el contexto de la clase. Ellos mismos no pueden recibir acceso a ninguna propiedad de clase común, ya que dichas propiedades pertenecen a objetos.

    Sin embargo, a partir de métodos estáticos, como probablemente haya adivinado, puede referirse a las propiedades estáticas. Y si cambia la propiedad estática, todas las instancias de esta clase podrán acceder a un nuevo valor.

    Dado que el acceso al elemento estático se lleva a cabo a través de la clase, y no a través de una instancia de objeto, no necesitamos una variable que se refiere al objeto. En su lugar, se usa un nombre de clase, después de lo cual se indican dos colores "::".

    Imprimir Staticexample :: $ Anum; Staticexample :: Sayhello ();

    Con esta sintaxis, ya debe estar familiarizado en base a la OOP en PHP. Utilizamos el diseño "::" en combinación con una palabra clave padre. Con el fin de obtener acceso al método de clase madre redefinida.

    Ahora, como entonces, llamamos a la clase, y no a los datos contenidos en el objeto. En el código de clase, puede usar una palabra clave padre. Para acceder a la superclase, sin usar el nombre de la clase.

    Para acceder al método estático o propiedad de la misma clase (y no desde una clase infantil), usaremos la palabra clave uno mismo..

    Palabra clave uno mismo. Se utiliza para apelar a la clase actual, y pseudo-destruido. $ Esto - al objeto actual. Por lo tanto, desde fuera de la clase Staticexample Apelamos a la propiedad $ Anum Usando su nombre de clase.

    Staticexample :: $ anum;

    Y dentro de la clase Staticexample Puedes usar una palabra clave uno mismo..

    Clase Staticexample (estático Público $ Anum \u003d 0; Función pública estática Sayhello () (Self :: $ Anum ++; Imprimir "Hola! (". Sí mismo :: $ anum ")) \\ n"))

    Nota: Además de los casos de apelación al método de clase madre redefinida, el diseño "::" siempre debe usarse solo para acceder a métodos o propiedades estáticas.

    Por definición, los métodos estáticos no se invocan en el contexto del objeto. Por esta razón, los métodos y propiedades estáticos a menudo se denominan variables y propiedades de clase. Como resultado, es imposible usar pseudo-destruido. $ Esto Dentro del método estático.

    ¿Por qué usar el método estático o la propiedad?

    Así que alcanzamos el tema más importante. El hecho es que los elementos estáticos tienen una serie de características útiles.

    primeramenteEstán disponibles desde cualquier punto del script (siempre que tenga acceso a la clase). Esto significa que puede acceder a las funciones sin enviar una instancia de la clase de un objeto a otro o, incluso peor, ahorre una instancia de un objeto en una variable global.

    en segundo lugar, La propiedad estática está disponible para cada instancia del objeto de esta clase. Por lo tanto, puede definir los valores que deben ser accesibles para todos los objetos de este tipo.

    Y finalmente terceraEl hecho de que no necesita tener una instancia de una clase para acceder a su propiedad o método estático evitará la creación de instancias de objetos únicamente por llamar a una función simple.

    Para demostrar esto, vamos a crear un método estático para clase. Shopproduct.Lo que creará automáticamente instancias de objetos. Shopproduct.. C Usando SQLite Determine la tabla productos. de la siguiente manera:

    Cree productos de tabla (ID Integer PRIMARSE KEY AutoInCrement, escriba texto, texto de primer nombre, texto de nombre principal, texto de título, precio flotante, numpages int, reproductlength int, descuento int)

    Ahora crea un método obtener Instancia ()que pasa el identificador de línea y un objeto de tipo PDO. Se utilizarán para extraer la fila de la tabla de la base de datos, sobre la base de la cual se forme el objeto de tipo. Shopproduct.Regresó al programa de llamadas.

    Podemos agregar estos métodos a la clase. Shopproduct.que nos fue creado en materiales anteriores. Como es probable que sepa, PDO está descifrado como objeto de datos PHP (Objetos de datos PHP). La clase PDO proporciona una interfaz universal para varias aplicaciones de base de datos.

    // Clase ShopProduct Private $ ID \u003d 0; Función pública SetID ($ ID) ($ esta-\u003e ID \u003d $ ID;) / ... Función estática pública GetInstance ($ ID, PDO $ PDO) ($ STMT \u003d $ PDO-\u003e Prepare ("Seleccionar * de productos Donde id \u003d? "); $ Resultado \u003d $ stmt-\u003e Ejecutar (Array ($ ID)); $ show \u003d $ stmt-\u003e fetch (); si (vacío ($ fila)) (devuelve nulo) si ($ ROW ["TIPO"] \u003d\u003d "LIBRO") ($ producto \u003d nuevo bookproduct ($ fila ["[" título "], $ fila [" primer nombre "], $ show [" mainname "], $ fila [" precio "] , $ ROW ["NUMPAGES"]);) De lo contrario, si ($ ROW ["TIPO"] \u003d\u003d "CD") ($ producto \u003d nuevo CDPRODUCT ($ Fila ["Título"], $ Fila ["FirstName"], $ Show ["MainName"], $ ROW ["Precio"], $ Fila ["PlaylTength"]);) Else ($ producto \u003d nueva tienda de productos ($ ship ["title"], $ fila ["primer nombre"], $ fila ["MainName"], $ Fila ["Precio"]);) $ Producto-\u003e SetID ($ Fila [ID "]); $ Producto-\u003e SetDiscount ($ Fila [" Descuento "]); devolver $ producto ;) // ...

    Como se puede ver, el método. obtener Instancia () Devuelve tipo de objeto Shopproduct., y es suficiente "inteligente" para que se base en el valor del campo tipo Crea un objeto con las características deseadas.

    Bajé específicamente el código de manejo de errores para que el ejemplo fuera más sencillo. Por ejemplo, en la versión real de este código, no podemos ser demasiado confiables y suponer que el objeto PDO transmitido se inicializó y conectó correctamente a la base de datos requerida.

    De hecho, es probable que concluyamos un objeto PDO en una clase que garantice tal comportamiento. Volveremos a esta pregunta en uno de los futuros materiales.

    Método obtener Instancia () Más útil en el contexto de la clase que en el contexto del objeto. Hace que sea fácil convertir datos que se encuentren en la base de datos al objeto, y para esto no necesitamos tener una instancia separada del objeto tipo Shopproduct..

    Este método no utiliza ningún método o propiedades que requieren una instancia separada del objeto, por lo que no hay razón para no declararla estática. Luego, tener un objeto PDO correcto, podemos llamar a este método desde cualquier ubicación de la aplicación.

    $ dsn \u003d "sqlite: //home/bob/projects/products.db"; $ PDO \u003d nuevo PDO ($ DSN, NULL, NULL); $ PDO-\u003e Setatitribute (PDO :: attr_errmode, PDO :: Errmode_Exception); $ Obj \u003d shopproduct :: getInstance (1, $ PDO);

    Tales métodos funcionan como "fábrica", ya que toman materiales "crudos" (por ejemplo, los datos obtenidos de la cadena de la base de datos o el archivo de configuración) y usándolos para crear objetos.

    El término "fábrica" \u200b\u200bse refiere al código diseñado para crear instancias de objetos. Con ejemplos de tales "fábricas" nos reuniremos con usted.


    Propiedades permanentes

    Algunas propiedades no deben cambiar. Por ejemplo, elementos tales como códigos de error o códigos de estado del programa generalmente se configuran manualmente en las clases. Aunque deben estar disponibles públicamente y estáticos, el código del cliente no debe poder cambiarlos.

    Para hacer esto, puede definir las propiedades constantes dentro de la clase. Al igual que las constantes globales, las constantes de la clase no se pueden cambiar después de haber sido identificadas. La propiedad permanente declara usando una palabra clave const..

    A diferencia de las propiedades convencionales, el signo de dólar no se pone antes del nombre de la propiedad permanente. De acuerdo con el acuerdo adoptado, a menudo se prescriben nombres que consisten en solo mayúsculas, como en el siguiente ejemplo:

    Clase ShopProduct (Const Disponible \u003d 0; const out_of_stock \u003d 1; // ...

    Las propiedades permanentes pueden contener solo valores relacionados con el tipo elemental. Constante no se puede asignar un objeto.

    Al igual que con las propiedades estáticas, el acceso a las propiedades permanentes se realiza a través de la clase, y no a través de una instancia del objeto. Así como una constante se determina sin un signo de dólar, al acceder a ella, sino que también no necesita usar ningún símbolo al frente.

    Print ShopProduct :: Disponible;

    El intento de asignar una constante al valor después de que se declarara, resultará en un error en la etapa del análisis sintáctico.

    Las constantes deben usarse cuando la propiedad debe ser accesible para todas las instancias de la clase y cuando el valor de la propiedad debe ser fijo y sin cambios.

    Completo este artículo, y a continuación hablaremos.

    ¿Te gustó el material y quieres agradecer?
    ¡Solo comparte con amigos y colegas!




    ¿Te gustó el artículo? Compártelo