2009-08-27 46 views
43

Estoy tratando de aprender OOP. Los llamados ejemplos del "mundo real" en los libros que estoy leyendo no ayudan.PHP: OOP del mundo real ejemplo

Todos los ejemplos como Pet, Car, Human ya no me ayudan. Necesito ejemplos de la vida real que les gusta el registro, páginas de perfil de usuario, etc.

Un ejemplo:

$user->userName = $_POST['userName'];//save username 
$user->password = $_POST['password'];//save password 
$user->saveUser();//insert in database 

También he visto:

$user->user = (array) $_POST; 

donde:

private $user = array(); 

Almacena toda la información en una matriz.

Y dentro de esa misma clase se encuentra

$user->getUser($uid); 
// which sets the $this->user array equal to mysqli_fetch_assoc() using 
//the user id. 

¿Hay ejemplos reales de aplicación orientada a objetos en diversas aplicaciones php (registro, inicio de sesión, la cuenta de usuario, etc.)?

+0

** Por favor, vea también: ** "jerga-libre de la comparación programación orientada a objetos vs procesal": http://stackoverflow.com/questions/1530868 – dreftymac

Respuesta

77

OOP no se trata solo de cómo se ve y funciona una sola clase. También se trata de cómo las instancias de una o más clases trabajan juntas.

Es por eso que ve tantos ejemplos basados ​​en "Cars" y "People" porque realmente hacen un buen trabajo al ilustrar este principio.

En mi opinión, las lecciones más importantes de la programación orientada a objetos son encapsulación y polimorfismo.

Encapsulación: datos de acoplamiento y la lógica que actúa sobre que los datos juntos de una manera concisa, lógica Polimorfismo: La capacidad de un objeto a look-similares y/o se comportan como otro.

Un buen ejemplo del mundo real de esto sería algo así como un iterador de directorio. ¿Dónde está este directorio? Tal vez es una carpeta local, tal vez es remota como un servidor FTP. ¡Quién sabe!

Aquí está un árbol de la clase básica que demuestra la encapsulación:

<?php 

interface DirectoryIteratorInterface 
{ 
    /** 
    * @return \Traversable|array 
    */ 
    public function listDirs(); 
} 

abstract class AbstractDirectoryIterator implements DirectoryIteratorInterface 
{ 
    protected $root; 

    public function __construct($root) 
    { 
     $this->root = $root; 
    } 
} 

class LocalDirectoryIterator extends AbstractDirectoryIterator 
{ 
    public function listDirs() 
    { 
     // logic to get the current directory nodes and return them 
    } 
} 

class FtpDirectoryIterator extends AbstractDirectoryIterator 
{ 
    public function listDirs() 
    { 
     // logic to get the current directory nodes and return them 
    } 
} 

Cada clase/objeto es responsable de su propio método de recuperación de un listado de directorios. Los datos (variables) están acoplados a la lógica (funciones de clase, es decir, métodos) que usan los datos.

Pero la historia no ha terminado, ¿recuerdas cómo dije que OOP trata de cómo las instancias de clases funcionan juntas, y no de una sola clase u objeto?

Bien, entonces hagamos algo con esta información: ¿imprimirlo en la pantalla? Por supuesto. ¿Pero cómo? HTML? ¿Texto sin formato? RSS? Vamos a abordar eso.

<?php 

interface DirectoryRendererInterface 
{ 
    public function render(); 
} 

abstract class AbstractDirectoryRenderer implements DirectoryRendererInterface 
{ 
    protected $iterator; 

    public function __construct(DirectoryIteratorInterface $iterator) 
    { 
     $this->iterator = $iterator; 
    } 

    public function render() 
    { 
     $dirs = $this->iterator->listDirs(); 
     foreach ($dirs as $dir) { 
      $this->renderDirectory($dir); 
     } 
    } 

    abstract protected function renderDirectory($directory); 
} 

class PlainTextDirectoryRenderer extends AbstractDirectoryRenderer 
{ 
    protected function renderDirectory($directory) 
    { 
     echo $directory, "\n"; 
    } 
} 

class HtmlDirectoryRenderer extends AbstractDirectoryRenderer 
{ 
    protected function renderDirectory($directory) 
    { 
     echo $directory, "<br>"; 
    } 
} 

Ok, ahora tenemos un par de árboles de clase para atravesar y representar listas de directorios. ¿Cómo los usamos?

// Print a remote directory as HTML 
$data = new HtmlDirectoryRenderer(
    new FtpDirectoryIterator('ftp://example.com/path') 
); 
$data->render(); 

// Print a local directory a plain text 
$data = new PlainTextDirectoryRenderer(
    new LocalDirectoryIterator('/home/pbailey') 
); 
$data->render(); 

Ahora, sé lo que estás pensando, "¡Pero Peter, no necesito estos grandes árboles de clase para hacer esto!" pero si piensas eso, entonces te estás perdiendo el punto, al igual que sospecho que has estado con los ejemplos de "Coche" y "Personas". No se centre en las minucias del ejemplo; en su lugar, intente comprender lo que está sucediendo aquí.

Hemos creado dos árboles de clase donde uno (*DirectoryRenderer) utiliza la otra (*DirectoryIterator) de una manera esperada - esto se refiere a menudo como un contrato. A una instancia de *DirectoryRenderer no le importa qué tipo de instancia de *DirectoryIterator recibe, ni las instancias de *DirectoryIterator se preocupan por cómo se representan.

¿Por qué? Porque los hemos diseñado de esa manera. Simplemente se conectan entre sí y funcionan. Esto es OOP en acción.

+11

+2 si pudiera !! –

+0

¿hay algún ejemplo para los usuarios? deseo un ejemplo para administración y autenticación. si alguien sabe de algún lado, lo agradecería. – iLevi

+0

@Peter Bailey Desafortunadamente mi pregunta ha sido cerrada, pero me alegra mucho si me pueden ayudar con [esta pregunta (enlace aquí)] (http://stackoverflow.com/questions/14221240/practical-way-to-implement -oop-in-php-for-users # comment19725375_14221240) – iLevi

1

Como dijo astropanic, podría echar un vistazo al código fuente de un buen marco de PHP o biblioteca. Recomiendo Zend Framework, es muy modular y tiene un excelente diseño profesional. Diría que es una muy buena pieza de código PHP orientado a objetos.

Aún así, creo que no es tan fácil aprender de una gran parte del código de producción, ya que no estaba hecho para enseñarte nada. Pero si quieres un código PHP orientado a objetos del mundo real, el Zend Framework (o Symfony, o quizás CakePHP) es probablemente el camino a seguir.

1

Te aconsejo que te mantengas alejado de cualquier framework en este momento, si no sabes OOP, cavar en zend o cualquier otro framework sería demasiado.

PHP OOP deja de ser gracioso ... como ja, ja, gracioso, porque es compatible, pero PHP no es un lenguaje OOP como java o C#.

ejemplo corto sólo para subrayar mi declaración:

// define class 
class User { 
// define properties and methods 
public $name = ""; 
} 
// instantiate class 
$user = new User; // or new User() or new user, it's all the same 
echo $user->name; 

pero si usted quiere hacer programación orientada a objetos "sobre la marcha", se puede hacer lo siguiente:

$user = (object) array('name' => 'Peter'); 

y luego

$user->name; 

pero puede usar OOP como lo haría en Java o C#, pero no en la misma medida, y tenga en cuenta, sistemas populares como ¡wordpress y drupal no son puro OOP! pero también puedes hacer herencia y otras cosas de OOP de clasificación en PHP.

+13

Lo siento, pero 'user = array $ (objeto) ('name' => 'Peter'); '* IS NOT * OOP - o incluso cuando dice" OOP sobre la marcha ". eso es solo un objeto Usando objetos! = OOP. Obviamente, el uso de objetos es una parte integral de OOP, pero es aproximadamente * WAY * más que eso. –

7

Compre un libro como "PHP y Mysql aplicaciones diarias para Dummies".

Es viejo, lo sé [2005] pero muestra los conceptos de Inicio de sesión de usuario, Foro, Carritos de compras, etc., tanto en Procedural como en Object Oriented with Mysqli.

Me ayudó a aprender Object Oriented PHP, lo estudié mucho. Bien vale la pena el dinero.

OOP es muy parecido a agrupar partes de su programa en piezas reutilizables. No es tan difícil ser honesto contigo es solo la idea de empacar tus funciones en clases.

mundo real Mini ejemplo de cosas POO a continuación:

CLASE BASE DE DATOS
sesiones de clase
WEBFORMS CLASE
Class Email

CUENTAS DE CLASE (Ejemplo Funciones abajo)
FUNCIÓN SelectAccount
FUNCIÓN CHECKPASSWORD
FUNCTION CHECKUSERNAME
FUNCIÓN CREATEACCOUNT

Espero que sigas, PHP 6 será rediseñado para admitir OOP más que nunca.

¡Buena suerte!

1

No he ido muy lejos en PHP OOP, pero cuanto más lo entiendo, más fácil se vuelve. Los ejemplos de objetos están ahí para que entiendas cómo funciona el OOP. Entiendo y he pasado por esto antes, OOP trata solo de propiedades y métodos (variables y funciones normales). Programé en OOP real mismo aplicando los ejemplos de mis tutoriales y no necesariamente tenía que estar en el mundo real. Eso es como haber sido alimentado con cuchara y nunca entenderías OOP y sería fácil de olvidar. Mi consejo aprender a entender. Si comprende, puede hacer cualquier cosa y comprender el poder de OOP. Descargué este libro y creo que tú también deberías hacerlo. Pero eso es sólo como si alguien la construcción de sus aplicaciones para usted ...

Here un enlace al libro y PHP Aplicaciones diarias de MySQL para Dummies

1

Mientras Sé que esta pregunta se ha respondido ya, me siento como si Puedo agregar valor aquí.

No creo que deba usar PHP como lenguaje de programación para aprender OOP. Si desea aprender OOP para aplicaciones web, realmente debería estar mirando C# o Java. Una vez que haya aprendido OOP, puede aplicar este conocimiento a PHP. Un ejemplo de un libro que solía aprender OOP era Big Java by Cay S. Horstmann

¿Por qué digo esto ??? Debido a que hay literalmente millones de ejemplos en PHP de cómo hacer las cosas, sin embargo, no son muchos ejemplos de cómo programar correctamente. Además de esto, PHP te permite tomar muchos atajos, que no serían aceptables con los gustos de Java. Como tal, si programa PHP con una cabeza Java, entonces creo que será un programador más fuerte. OOP no es específico del idioma, es un paradigma de programación.

Si debe aprender OOP usando PHP, entonces le recomendaría que eche un vistazo a algún código fuente real en los repositorios públicos de github. Puede buscarlos en packagist.org. Si son un repositorio público decente, contendrán un archivo readme.md que le mostrará cómo usar los paquetes del compositor. Por ejemplo, https://github.com/moltin/laravel-cart, es un ejemplo de un paquete de carrito de compras que usted podría usar en su aplicación. Observe cómo no necesita mirar el código fuente del paquete para comprender qué hacen los paquetes. El paquete se ha escrito, y no le importa cómo funcionan, pero los usa, así que solo necesita saber cómo usarlos. Esto es exactamente de lo que se trata OOP.

No me importa cómo la clase de carrito de la compra agrega un artículo al carro, solo quiero crear un carro nuevo y agregarle algo.

Lo que estás haciendo, sin embargo, es sumergirte en el código fuente como una herramienta para entender cómo funciona el OOP.

Además de esto, y probablemente más importante, para el desarrollo de aplicaciones web, investigaría el patrón de diseño de MVC.

El patrón de diseño MVC significa Modelo, Vista, Controlador. En el caso de una aplicación web, The Model es responsable de modelar la base de datos, la vista es responsable de mostrar el contenido al usuario. El controlador es responsable de interactuar con el modelo y manejar la entrada del usuario.

Creo que debería intentar instalar el Laravel Framework u otro "marco moderno decente" en su máquina local. ¿Por qué digo moderno, porque los marcos modernos requieren una versión PHP mínima de 5.3+ que significa que el PHP en su máquina admitiría OOP real similar a la que obtendría de los gustos de Java.

Hay muchos tutoriales que le mostrarán cómo crear aplicaciones web en laravel. Inmediatamente, verás que cuando creas un controlador, extiendes un BaseController. Cuando creas un Modelo, extiendes Eloquent. Esto significa que ya estará usando Polimorfismo en su código. Verá que al usar clases, se encapsulan y verá que cada clase tiene un rol específico.

Cuando desee interactuar con la base de datos, inicialmente creará un objeto new Model dentro de los métodos del controlador. A medida que empiece a aprender más, comenzará a aprender cómo inyectar dependencias en el controlador, luego aprenderá cómo volcar sus modelos y crear repositorios y programas en las interfaces.

Un libro decente sobre cómo aprender Laravel para principiantes sería https://leanpub.com/codebright de Dale Rees. Conocí a Dale en una reunión de Laravel hace aproximadamente 2 semanas.

Además de esto, a medida que se Creación de aplicaciones web más competentes, usted comenzará a aprender cómo aplicar los siguientes principios a su programación:

  • principio de responsabilidad individual
  • Abierto Cerrado Principio
  • Principio de sustitución de Liskov
  • Principio de aislamiento de interfaz
  • Principio de inversión de dependencia
0

Sugiero también ver mi contenedor Arrayzy. Es una biblioteca nativa de manipulación de matrices PHP en modo OOP.

lo tanto, si se trabaja con un arreglo de funciones nativas de PHP - que podría hacer las mismas cosas de programación orientada a objetos y Arrayzy le ayuda con él, por ejemplo:

// Functional programming: 
$array = ['a', 'b', 'c']; 
$resultArray = array_merge($array, ['c', 'd']); 

y

// Object-oriented programming: 
$obj = Arrayzy\MutableArray::create(['a', 'b', 'c']); 
$obj->mergeWith(['c', 'd']); 
$resultArray = $obj->toArray(); 

En ambos casos la matriz resultante será:

Array(
    0 => 'a' 
    1 => 'b' 
    2 => 'c' 
    3 => 'c' 
    4 => 'd' 
) 

Comprobar cómo este método mergeWith (u otro) trabaja bajo el capó

creo que este es un buen ejemplo que demuestra que casi todo funcional código que podría reemplazar con POO código como en esta biblioteca. Pero con OOP obtienes mucho más y también puedes consultar la pregunta Functional programming vs OOP para obtener más información sobre las desventajas y los accesorios.

Cuestiones relacionadas