Bienvenida e Introducci贸n

1

驴Por qu茅 aprender Programaci贸n Orientada a Objetos?

2

驴Qu茅 resuelve la Programaci贸n Orientada a Objetos?

3

Paradigma Orientado a Objetos

4

Lenguajes Orientados a Objetos

5

Instalando Visual Studio Code

6

Diagramas de Modelado

7

Qu茅 es UML

Orientaci贸n a Objetos

8

Objetos

9

Abstracci贸n y Clases

10

Modularidad

11

Analizando Uber en Objetos

12

Reto 1: identificando objetos

Programaci贸n Orientada a Objetos. An谩lisis

13

Clases en UML y su sintaxis en c贸digo

14

Modelando nuestros objetos Uber

15

驴Qu茅 es la herencia?

16

Aplicando Herencia a nuestro proyecto Uber

17

Reto 2: analicemos un problema

Clases, Objetos y M茅todo Constructor

18

Creando nuestras carpetas iniciales para el curso

19

Definiendo clases en Java y Python

20

Definiendo Clases en JavaScript

21

Objetos, m茅todo constructor y su sintaxis en c贸digo

22

Objetos. Dando vida a nuestras clases en Java y Python

23

Declarando un M茅todo Constructor en Java y JavaScript

24

JavaScript orientado a objetos, lo m谩s nuevo

25

Declarando un m茅todo constructor en Python

Herencia

26

Aplicando herencia en lenguaje Java y PHP

27

Soluci贸n del reto de herencia en PHP

28

Aplicando herencia en lenguaje Python y JavaScript

29

Otros tipos de Herencia

30

Reto 4

Encapsulamiento

31

Encapsulamiento

32

Encapsulando atributos en Java

Polimorfismo

33

Generando polimorfismo en Java

34

Generando polimorfismo en PHP

Cierre del curso

35

El Diagrama UML de Uber

36

Conclusiones

37

Bonus: Qu茅 es la Programaci贸n Orientada a Objetos

Generando polimorfismo en PHP

34/37

Lectura

Ahora que ya entiendes c贸mo funciona el polimorfismo y lo aplicaste a Java veamos c贸mo hacer el mismo ejemplo en PHP.

Aplicar polimorfismo en PHP es relativamente m谩s sencillo, pues este es un lenguaje con un tipado m谩s flexible (que no requiere que especifiques qu茅 tipo de dato usar) y su sintaxis es muy sencilla.

Hasta ahora esto es lo que tenemos en nuestro archivo car.php:


require_once('account.php');
class Car {

    public $id;
    public $license;
    public $driver;
    protected $passenger; // Es importante que esta propiedad est茅 marcada como protected

    public function __construct($license, $driver){
        $this->license = $license;
        $this->driver = $driver;
    }

    public function printDataCar() {
        echo "Licencia: $this->license Driver: ".$this->driver->name;
    }
    
}
?>

A煤n nos falta a帽adir nuestros getters y setters, en PHP es sencillo, simplemente tenemos que escribir dos funciones, una que nos devuelva nuestro n煤mero de pasajeros, y otra que nos permita establecer cierto n煤mero de pasajeros.

La funci贸n getter es la m谩s sencilla de todas, pues simplemente hay que retornar el valor de la propiedad passenger:

public function getPassenger() {
    return $this->passenger;
}

Recuerda que para hacer nuestra funci贸n setter necesitamos hacer una validaci贸n. Uber 煤nicamente nos permite tener 4 pasajeros (comportamiento que modificaremos m谩s adelante con polimorfismo), por lo que nuestra funci贸n setter quedar铆a as铆:

public function setPassenger($passenger) {
        
    if ($passenger == 4) {
        $this->passenger = $passenger;
    }
    else {
        echo "Necesitas asignar 4 pasajeros";
    }

}

隆Genial!, ahora ya estamos listos para empezar a trabajar, recuerda que ya deber铆as tener tu clase UberVan creada hasta este punto 馃槈.

Antes de comenzar a aplicar polimorfismo veamos qu茅 sucede si intento generar una instancia de 6 pasajeros con mi clase UberVan, recuerda que para hacer estas pruebas estamos trabajando sobre nuestro archivo index.php (no olvides hacer el require hacia el archivo uberVan.php 馃憖):

$uberVan = new UberVan("OJL395", new Account("Ra煤l Ram铆rez", "AND456"), "Nissan", "Versa");
$uberVan->setPassenger(6);
$uberVan->printDataCar();

Cuando trato de ejecutar este c贸digo, esto es lo que me imprime en mi navegador:

php-poo.png

Me dice que solo puedo asignar 4 pasajeros, 隆pero para Uber Van deben ser 6 pasajeros! Es hora de usar el polimorfismo.

Aplicando polimorfismo

Para permitir que la clase UberVan acepte 6 pasajeros sin afectar a las otras clases de Uber, necesitamos sobreescribir el m茅todo setPassenger, pero permitiendo que esta vez acepte 6 pasajeros.

Recuerda que cuando aplicamos herencia, todos los m茅todos de la clase Car fueron pasados a la clase UberVan, por tanto, esta clase tambi茅n tiene acceso al m茅todo setPassenger, pero este m茅todo solo permite 4 pasajeros. Para aplicar polimorfismo, podemos sobreescribir dicho m茅todo dentro de nuestra clase UberVan alojada en el archivo uberVan.php, 隆pero ahora permitiendo 6 pasajeros!

public function setPassenger($passenger) {
    
    if ($passenger == 6) {
        $this->passenger = $passenger;
    }
    else {
        echo "Necesitas asignar 6 pasajeros 
"
; } }

Si lo deseas, tambi茅n puedes a帽adir la propiedad $passenger a la clase UberVan (aunque en PHP no es necesario):

protected $passenger;

Para hacerlo m谩s interesante, vamos a cambiar el c贸digo de nuestro m茅todo printDataCar de la clase Car ubicada en car.php por el siguiente:

public function printDataCar() {
    echo "
        Licencia: $this->license 
        Driver: {$this->driver->name} 
        N煤mero de pasajeros: $this->passenger
        
"
; }

El c贸digo es el mismo, pero lo hicimos m谩s legible, agregamos la informaci贸n del n煤mero de pasajeros y agregamos un salto de l铆nea al final.

隆Ahora pongamos a prueba nuestra clase polim贸rfica! Vayamos a nuestro index.php, aqu铆 ya ten铆amos escrito el c贸digo para instanciar nuestra clase UberVan con 6 pasajeros, pero agreguemos el c贸digo para instanciar una clase de 4 pasajeros:

$uberX = new UberX("CVB123", new Account("Andres Herrera", "AND456"), "Chevrolet", "Spark");
$uberX->setPassenger(4);
$uberX->printDataCar();

隆Vual谩!, ahora vemos que nuestra clase UberVan nos permite a帽adir 6 pasajeros, mientras que el resto de clases nos permite seguir a帽adiendo 4 pasajeros, 隆hemos creado una clase polim贸rfica!

poo-poli.png

Reto

Ahora que ya sabes c贸mo trabajar con polimorfismo en PHP, te reto a que apliques el polimorfismo al m茅todo printDataCar de la clase Car en la clase UberX de tal forma que al llamarlo desde una instancia de UberX este tambi茅n imprima la marca y el modelo.

Una vez que hayas completado el reto puedes dejar tu soluci贸n en los aportes de la clase y compararlo con la soluci贸n de otros estudiantes. 隆Nos vemos en la siguiente clase para dar un repaso al diagrama UML de Uber que obtuvimos al final!

Aportes 53

Preguntas 2

Ordenar por:

驴Quieres ver m谩s aportes, preguntas y respuestas de la comunidad? Crea una cuenta o inicia sesi贸n.

<?php
require_once('car.php');
class UberX extends Car {
    public $brand;
    public $model;

    public function __construct($license, $driver, $brand, $model){
        parent::__construct($license,$driver);
        $this->license = $license;
        $this->driver = $driver;
        $this->brand = $brand;
        $this->model = $model;
    }

    public function PrintDataCar(){
        parent::PrintDataCar();
        echo" 
        Modelo: $this->model
        Marca: $this->brand 
        ";
      }
}
?>

Ac谩 dejo una explicaci贸n pero para Python:
https://www.youtube.com/watch?v=gDGdRXLbFKs

Para JavaScript

Permisos

Los unicos permisos que se puede asignar en JS son publico (default) y privado. Los permisos privados se asignan agregando 鈥#鈥 antes del nombre del atributo. (ej. this.#passenger). Sin embargo no usaremos atributos privados en este ejercicio. Documentaci贸n sobre los permisos privados.
.


Getters and Setters

Para referirse a un atributo que debe ser 鈥減rotegido鈥 la convenci贸n es agregar un 鈥淿鈥 antes del nombre del atributo (ej. this._passenger). Los getters y setters ser铆an declarados de la siguiente manera.

  get passenger() {
    return this._passenger
  }

  set passenger(passengers) {
    if (passengers != 4) {
      console.log("Debes tener 4 pasajeros")
    } else {
      this._passenger = passengers
    }

Estos son creados como atributos, no como funciones por lo que la forma correcta de llamarlos ser铆a:

// Forma Correcta
console.log(this.passsenger) // Llama al getter del atributo ._passenger
this.passenger = 4 // Llama al setter del atributo ._passenger

// Forma incorrecta
this.passenger(4) // Devuelve un error ya que no he sido creado como funcion
console.log(this._passsenger) // Devuelve el valor correcto, pero son malas practicas. El chiste es que uses el getter.
this._passenger = -4 // Funciona pero son malas practicas y no podr铆as verificar los valores.

C贸digo completo

Car.js

export default class Car {
  constructor(license, driver){
    this.id
    this.license = license
    this.driver = driver
    this._passenger
  }

  get passenger() {
    return this._passenger
  }

  set passenger(passengers) {
    if (passengers != 4) {
      console.log("Debes tener 4 pasajeros")
    } else {
      this._passenger = passengers
    }
  }

  printDataCar() {
    console.group(this.id)
    console.log('License: ' + this.license)
    console.log('Nombre: ' + this.driver.name)
    console.log('DNI: ' + this.driver.document)
    console.log('Pasajeros: ' + this.passenger)
    console.groupEnd()
  }
}
// Para hacerlo con require
// module.exports = Car

UberX

import Car from './Car.js'

export default class UberX extends Car {
  constructor(license, driver, brand, model) {
    super(license, driver)
    this.brand = brand
    this.model = model
  }

  printDataCar() {
    super.printDataCar()
    console.group()
    console.group('Carro:')
    console.log('Marca: ' + this.brand)
    console.log('Modelo: ' + this.model)
    console.groupEnd()
    console.groupEnd()
  }
}

UberVan

import Car from './Car.js'

export default class UberVan extends Car {
  // constructor(license, driver, typeCarAcceppted, seatsMaterial) {
  //   super(license, driver)
  //   this.typeCarAcceppted = typeCarAcceppted
  //   this.seatsMaterial = seatsMaterial
  // }
  constructor(license, driver) {
    super(license, driver)
  }

  get passenger() {
    return this._passenger
  }

  set passenger(passengers) {
    if (passengers != 6) {
      console.log("Debes tener 6 pasajeros")
    } else {
      this._passenger = passengers
    }
  }
}

index.js

import Account from "./Account.js";
import UberX from "./UberX.js";
import UberVan from "./UberVan.js";

// Para hacerlo con require (quitar el 'type' : 'modules', del archivo package.json)
// const Account = require('./Account')
// const Car = require('./Car')

let uberX = new UberX(
  "FDR232",
  new Account("Andres Herrera", "AND54R"),
  "Chevrolet",
  "Spark"
);
uberX.id = "UberX 232478321";
uberX.passenger = 4;
uberX.printDataCar();

let uberVan = new UberVan(
  "DGC548",
  new Account("Francisco Peralta", "FR56ALF")
);
uberVan.id = "Ubervan 45432124";
uberVan.passenger = 6;
uberVan.printDataCar();


Nota

Para verlo en el navegador solo es necesario llamar al index.js de la siguiente manera:

  <script type="module" src="./index.js"></script>

Funciona usando import y export. Aqu铆 la documentaci贸n.


Tambien lo puedes ver en la consola usando node.js

npm init -y // En la carpeta JS y luego agregar la siguiente linea en el archivo ' package.json
    "type": "module",
node index.js // para correr el archivo

Mi aporte:

Aporte (hecho con amor jeje)
Clase Car.php :

<?php
require_once('Driver.php');
class Car{
    protected $id;
    protected $license;
    protected $driver;
    protected $passengers;

    public function __construct($license, $driver)
    {
        $this->license = $license;
        $this->driver = $driver;
    }
    // M脡TODO
    

    public function getId() {
        return $this->id;
    }
    public function setId($id){
        $this->id = $id;
    }

    public function getLicense() {
        return $this->license;
    }
    public function setLicense($license){
        $this->license = $license;
    }

    public function getDriver() {
        return $this->driver;
    }
    public function setDriver($driver){
        $this->driver = $driver;
    }

    public function getPassenger() {
        return $this->passengers;
    }

    public function setPassenger($passengers) {
        
        if ($passengers == 4) {
            $this->passengers = $passengers;
        }
        else {
            echo "Necesitas asignar 4 pasajeros <br>";
        }
    
    }

    public function printDataCar() {
        echo "
            Licencia: $this->license 
            Driver: {$this->driver->name} 
            Document: {$this->driver->document}
            N煤mero de pasajeros: $this->passengers
            <br>
        ";
    }
}

Clase UberX.php :

<?php
    require_once('Car.php');
    class uberX extends Car{
        public $brand;
        public $model;

        public function __construct($license, $driver, $brand, $model)
        {
            // siempre es necesario pasarle los parametros a la clase
            // padre a la clase padre
            parent::__construct($license,$driver);
            $this->brand = $brand;
            $this->model = $model;
        }

        public function printDataCar() {
            echo "
                Licencia: $this->license 
                Driver: {$this->driver->name} 
                Document: {$this->driver->document}
                N煤mero de pasajeros: $this->passengers
                Modelo: $this->model
                Marca: $this->brand
                <br>
            ";
        }
        
    
    }
?>

Reusltado:

Hacen falta estas clases con python y js

Si una clase se inicia con 4 programas de desarrollo, hay que terminar con 4 programas, as铆 tome tiempo, se que uno puede investigar pero quedamos en las mismas, autodidacta no aplica cuando quieres profesionalismo, debes de tener gu铆a

Aqu铆 mi aporte

Reto: Imprimir marca y modelo

Me costo un gran tiempo de mi vida, pero lo he logrado.

He hecho el ejercicio de Polimorfismo en JavaScript, Java, Php y Python.

Link a el Repo de Github porqu茅 ni loco y no creo que Platzi me deje por el tama帽o. Casi 200 por cada lenguaje, inclusive Python.

Repo del C贸digo del Curso en GitHub

馃榿

Hola, as铆 me qued贸:

<?php
require_once('car.php');
class UberX extends Car {
  public $brand;
  public $model;

   public function __construct($license, $driver, $brand, $model){ 
    parent::__construct($license, $driver);
    $this->brand = $brand;
    $this->model = $model;
  }
  
  public function printDataUberX(){
    parent::PrintDataCar();
    echo "Brand: $this->brand
          Model: $this->model";
  }

}
?>

Yo lo hice de esta manera:

UberX.php

<?php
require_once('Car.php');
class UberX extends Car {
    public $brand;
    public $model;

    public function __construct ($license, $driver, $brand, $model){
        
        parent::__construct($license, $driver );
        $this->brand = $brand;
        $this->model = $model;
    }
    public function printDataCar(){
        echo
        "
        License: $this->license
        Name: {$this->driver->name}
        Document: {$this->driver->document}
        Brand: $this->brand
        Model: $this->model
        
        ";
    }
}

?>

馃挋 Resolviendo el problema en lenguaje Dart, aplicando polimorfismo.

import 'car.dart';

class UberX extends Car{
  String brand;
  String model;

  UberX({license, driver, this.brand, this.model}): super(license: license, driver: driver);

  @override
  void printDataCar() {
    super.printDataCar();
    print('Model: $model Brand: $brand');
  }
}

Aqu铆 mi c贸digo en php
index.php

<code> 
<?php
require_once('car.php');
require_once('uberX.php');
require_once('account.php');
require_once('uberPool.php');
require_once('uberVan.php');

$car = new Car("David Espino", "KAL9123");
$car->setPassenger(4);
$passenger = $car->getPassenger();
echo $car->showCarInfo($passenger);

$uberVan = new UberVan("JOK9812", "Gerardo Espino", "Accepted", "Accepted");
$uberVan->setPassenger(6);
$passenger = $uberVan->getPassenger();
echo $uberVan->showCarInfo($passenger);

$uberX = new UberX("Leonora Contreras", "NJL9812", "Volkswagen", "Tiguan");
$uberX->setPassenger(4);
$passenger = $uberX->getPassenger();
echo $uberX->showCarInfo($passenger);

car.php

<code> 
<?php
require_once('account.php');
class Car extends Account{
    public $id;
    public $license; 
    public $driver;
    protected $passenger;
    public function __construct($name, $license)
    {
        $this->name = $name;
        $this->license = $license;
    }
    public function showCarInfo($passenger)
    {
        if($passenger != null){
            return "Conductor: $this->name Placas: $this->license Pasajeros: $this->passenger <br/>";
        } 
    }
    public function setPassenger($passenger)
    {
        if($passenger >= 4){
            $this->passenger = $passenger;
        } else {
            echo "Necesitas tener m铆nimo 4 espacios disponibles <br/>";
        }
    }
    public function getPassenger(){
        return $this->passenger;
    }
}

uberVan.php

<code> 
<?php 
require_once('car.php');

class UberVan extends Car {
    public $typeCarAccepted;
    public $seatsMaterial;
    protected $passenger;
    public function __construct($license, $driver, $typeCarAccepted, $seatsMaterial)
    {
        parent::__construct($license, $driver);
        $this->typeCarAccepted = $typeCarAccepted;
        $this->seatsMaterial = $seatsMaterial;
    }

    public function setPassenger($passenger)
    {
        if($passenger >= 6){
            $this->passenger = $passenger;
        } else {
            echo "Necesitas tener m铆nimo 6 espacios disponibles";
        }
    }
    
}

uberX.php

<code> 

<?php
require_once(鈥榗ar.php鈥);
class UberX extends Car{
public $brand;
public $model;
public function __construct($driver,$license, $brand, $model)
{
parent::__construct($driver, $license);
$this->brand = $brand;
$this->model = $model;
}
public function showCarInfo($passenger)
{
echo 鈥淐onductor: $this->driver Matricula: $this->license Marca: $this->brand Modelo: $this->model <br/>鈥;
}
}
?>

<?php

require_once('Car.php');
require_once('UberX.php');
require_once('Account.php');
require_once('UberPool.php');
require_once('UberVan.php');

$uberX = new UberX("CVB123", new Account("Andres Herrera", "AND456"), "Chevrolet", "Spark");
$uberX -> setPassenger(4);
$uberX -> printDataCar();

$uberPool = new UberPool("TYU567", new Account("Andrea Ferran", "ANDA765"), "Dodge", "Attitude");
$uberPool -> printDataCar();

$uberVan = new UberVan("OJL456", new Account("Raul Ramirez", "AND456"), "Nissan", "Versa");
$uberVan -> setPassenger(6);
$uberVan -> printDataCar();
?>
<?php

require_once('Car.php');

class UberX extends Car {
    public $brand;
    public $model;

    public function __construct($license, $driver, $brand, $model) {
        parent::__construct($license, $driver);
        $this -> brand = $brand;
        $this -> model = $model;
    }

    public function printDataCar() {
        echo "Licencia: $this->license <br>";
        echo "Driver: {$this->driver->name} <br>";
        echo "Numero de pasajeros: $this->passenger <br><br>";     
        echo "Marca: $this->brand <br>";  
        echo "Modelo: $this->model <br>";          
    }
}
?>
<?php
require_once('car.php');
class UberX extends Car {
    public $brand;
    public $model;

    public function __construct($license, $driver, $brand, $model){
        parent::__construct($license,$driver);
        $this->brand = $brand;
        $this->model = $model;
    }

    public function printDataCar() {
        echo "
            Licencia: $this->license 
            Driver: {$this->driver->name} 
            Passengers: $this->passenger
            Brand: $this->brand
            Model: $this->model
            
        ";
    }
}
?>
public function printDataCar() {
    parent::printDataCar();
    echo "
        Brand: $this->brand 
        Model: {$this->model} 
        

    ";
}
<?php

class Car {

    private $id;
    protected $license;
    protected $driver;
    protected $passenger;


    public function __construct($licence, Account $driver)
    {
        $this->license = $licence;
        $this->driver  = $driver;
    }

    public function setPassenger($passenger) {
        $this->passenger = $passenger;
    }

    public function getPassenger() {
        return $this->passenger;
    }

    public function printDataCar () {
        echo 'Licencia: ' . $this->license . '<br>';
        echo 'Conductor: ' . $this->driver->name;

    }
}

<?php
include_once './Car.php';
class UberVan extends Car{

    public $typeCarAccepted;
    public $seatsMaterial;

    public function __construct($licence, $driver, $typeCarAccepted, $seatsMaterial)
    {
        parent::__construct($licence, $driver);
        $this->typeCarAccepted = $typeCarAccepted;
        $this->seatsMaterial   = $seatsMaterial;
    }


    public function setPassenger($passenger) {
        if ($passenger == "6") {
            $this->passenger = $passenger;
        }else {
            echo "El numero de pasajero valido es 4";
        } 
    }

    public function printDataCar () {
        echo 'Licencia: ' . $this->license . '<br>';
        echo 'Conductor: ' . $this->driver->name . '<br>';
        echo 'Pasajeros van: ' . $this->getPassenger() . '<br>';

    }
}
<?php
include_once './Car.php';

class UberX extends Car{

    public $brand;
    public $model;



    public function __construct($licence, $driver, $brand, $model)
    {
        parent::__construct($licence, $driver);
        $this->brand = $brand;
        $this->model = $model;
    }

    public function setPassenger($passenger) {
        if ($passenger == "4") {
            $this->passenger = $passenger;
        }else {
            echo "El numero de pasajero valido es 4";
        } 
    }

    public function printDataCar () {
        echo 'Licencia: ' . $this->license . '<br>';
        echo 'Conductor: ' . $this->driver->name .  '<br>';
        echo 'Pasagero: ' . $this->passenger .  '<br>';

    }
}

Licencia: MAD-485
Conductor: Mateo Florez
Pasagero: 4
Licencia: MAD-485
Conductor: Jose Florez
Pasajeros van: 6

Esto esta en la clase uberX.php:
public function printDataCar() {
parent::printDataCar();
echo "Model $this->model
Brand $this->brand ";
}

Este es mi archivo uberX.php

<?php
require_once('Car.php');

class Uberx extends Car{
    public $brand;
    public $model;

    public function __construct($license, $driver, $brand, $model) {
        parent::__construct($license,$driver);
        $this->brand = $brand;
        $this->model = $model;
    }
    
    public function printDataCar()
    {
        echo "
        <b>License:</b> $this->license
        <b>Driver:</b> {$this->driver->name}
        <b>Passenger's Number:</b> $this->passenger
        <b>Brand:</b> $this->brand
        <b>Model:</b> $this->model
        <br>
        ";
    }
}

?>

El codigo del reto:

<?php
    require_once 'Car.php';
    require_once("UberX.php");
    require_once("UberPool.php");
    require_once 'Account.php';

    $uberX = new UberX("CVB123",new Account("Andres Herrera", "AND456"), "Chevrolet", "Spark");
    $uberX->setPassenger(4);
    $uberX->printDataCar();

    // $uberPool = new UberPool("TYU567",new Account("Andrea Ferran", "ANDA765"), "Dodge", "Attitude");
    // $uberPool->printDataCar();
?>

Para la clase uberX

<?php
require_once 'Car.php';

class UberX extends Car {
    public $brand;
    public $model;

    function __construct($license, $driver, $brand, $model) {
        parent::__construct($license,$driver);
        $this->brand = $brand;
        $this->model = $model;
    }

    function printDataCar(){
        echo "
        License: $this->license
        Driver: {$this->driver->name}
        N煤mero de pasajeros: $this->passenger
        Model: $this->model
        Brand: $this->brand

        ";
    }
}
?>
<?php
require_once('car.php');
class UberX extends Car{
    public $brand;
    public $model;
    public function __construct($license,$driver,$brand,$model){
        parent::__construct($license,$driver);
        $this->brand=$brand;
        $this->model=$model;
    }
    public function ImprimeCar(){
        echo "
            License: $this->license
            Conductor: {$this->driver->name}
            Passenger: $this->passenger
            Brand: $this->brand
            Model: $this->model

            ";    
    }
}

RETO:

<?php
require_once(鈥楥ar.php鈥);
class UberX extends Car {
public $brand;
public $model;

public function __construct($license, $driver, $brand, $model){
    parent::__construct($license, $driver);
    $this->brand = $brand;
    $this->model = $model;
}

public function printDataCar() {
    echo "
        Licencia: $this->license 
        Driver: {$this->driver->name} 
        N煤mero de pasajeros: $this->passenger
        Marca: $this->brand
        Modelo: $this->model
        <br>
    ";
}

}

?>

Solucion al reto:
se debe crear el metodo printDataCar en uberX.php:

 public function printDataCar() {
        echo "
            Licencia: $this->license 
            Driver: {$this->driver->name} 
            N煤mero de pasajeros: $this->passenger
            Marca: $this->brand
            Modelo: $this->model
    
        ";
        echo "<br>";
        
    }

Mi aporte del reto:

<?php
require_once('car.php');
class UberX extends Car {
    public $brand;
    public $model;

    public function __construct($license, $driver, $brand, $model){
        parent::__construct($license, $driver);
        $this->brand = $brand;
        $this->model = $model;
    }

    public function printDataCar() {
        echo "Brand: $this->brand Model: ".$this->driver->model;
    }
}
?>

Buenas! Comparto mi resoluci贸n al reto, saludos!


UberX.php

<?php
require_once("car.php");
class UberX extends Car{
    public $brand;
    public $model;

    public function __construct($license, $driver, $brand, $model){
        parent::__construct($license, $driver);

        $this->brand = $brand;
        $this->model = $model;
            
    }

    public function printDataCar(){
        parent::printDataCar();
        echo "<p> Brand: $this->brand </p> <p> Model:  $this->model</p>";
    }


}
?>

MI codigo!

UberX.php

<?php
require_once 'Car.php';

class UberX extends Car
{
    public string $brand;
    public string $model;

    public function __construct(string $license, Account $driver, string $brand, string $model)
    {
        parent::__construct($license, $driver);
        $this->brand = $brand;
        $this->model = $model;
    }

    public function printDataCar()
    {
        parent::printDataCar();
        echo "Brand: {$this->brand} \nModel: {$this->model}\n";
    }
}

CLASE UBERX
<?php
require_once(鈥楥ar.php鈥);
class UberX extends Car {
public $brand;
public $model;

public function __construct($license, $driver, $brand, $model){
    parent:: __construct($license,$driver);
    $this->brand = $brand;
    $this->model = $model;
}
public function printDataCar(){
    echo "license: $this->license, 
          conductor: {$this->driver ->name}, 
          document: {$this->driver->document}, 
          passenger: {$this->passenger}, 
          brand: {$this->brand}, 
          model: {$this->model}";
    echo nl2br("\n");
}

}
?>

CLASE INDEX.PHP
<?php

require_once(鈥楥ar.php鈥);
require_once(鈥榰berX.php鈥);
require_once(鈥榰berPool.php鈥);
require_once(鈥楢ccount.php鈥);
require_once(鈥榰berVan.php鈥);

$uberX = new UberX(鈥淎WS234鈥, new Account(鈥淢arcos Cama鈥,鈥40225629鈥),鈥淐hevrolet鈥,鈥淪park鈥);
$uberX->setPassenger(4);
$uberX->printDataCar();

$uberPool = new UberPool(鈥淩ET123鈥, new Account(鈥淧edro Perez鈥,鈥10294790鈥),鈥淒odge鈥,鈥淎ltitude鈥);
$uberPool->setPassenger(4);
$uberPool->printDataCar();

$uberVan = new UberVan(鈥淓DR435鈥, new Account(鈥淧edro Benites鈥, 鈥94763964鈥),鈥淣issan鈥,鈥淰ersa鈥);
$uberVan->setPassenger(6);
$uberVan->printDataCar();

?>

public function printDataCar(){
            echo "
            Marca: {$this->brand}, 
            Modelo: {$this->model}
            ";
            parent::printDataCar();
            
        }

Este es mi aporte:

<?php
require_once("./account.php");
class Car
{
    private string $license;
    private Account $driver;
    private string $passenger;

    public function __construct($license, $driver)
    {
        $this->license = $license;
        $this->driver = $driver;
    }

    public function printDataCar()
    {
        return "License: $this->license\t" . "Conductor: " . $this->driver->name . " Document: " . $this->driver->document;
    }

    public function getPassenger()
    {
        return $this->passenger;
    }

    public function setPassenger($passenger)
    {
        $this->passenger = $passenger;
    }

    public function getLicense()
    {
        return $this->license;
    }

    public function setLicense($license)
    {
        $this->license = $license;
    }

    public function getDriver()
    {
        return $this->driver;
    }

    public function setDriver($driver)
    {
        $this->driver = $driver;
    }
}

UberX:

<?php
require_once("./car.php");
class UberX extends Car
{
    public string $brand;
    public string $model;

    public function __construct($license, $driver, $brand, $model)
    {
        parent::__construct($license, $driver);
        $this->brand = $brand;
        $this->model = $model;
    }

    public function printDataCar()
    {
        return "License: " . parent::getLicense() . "\tConductor: " . parent::getDriver()->name . " Document: " . parent::getDriver()->document . "\nBrand: " . $this->brand . "\nModel: " . $this->model;
    }
}

PHP:

require_once('Car.php');

class UberX extends Car {
    public $brand;
    public $model;

    public function __construct($license, $driver, $brand, $model) {
        parent::__construct($license, $driver);
        $this->brand = $brand;
        $this->model = $model;
    }

    public function PrintDataCar(){
       parent::PrintDataCar();
       echo "
       Modelo: $this->model Marca: $this->brand
       ";
    }
}

?>

index.js

import Account from "./Account.js";
import UberX from "./UberX.js";
import UberVan from "./UberVan.js";

// Para hacerlo con require (quitar el 'type' : 'modules', del archivo package.json)
// const Account = require('./Account')
// const Car = require('./Car')

let uberX = new UberX(
  "FDR232",
  new Account("Andres Herrera", "AND54R"),
  "Chevrolet",
  "Spark"
);
uberX.id = "UberX 232478321";
uberX.passenger = 4;
uberX.printDataCar();

let uberVan = new UberVan(
  "DGC548",
  new Account("Francisco Peralta", "FR56ALF")
);
uberVan.id = "Ubervan 45432124";
uberVan.passenger = 6;
uberVan.printDataCar();

<?php
require_once('car.php');
class UberX extends Car {
    public $brand;
    public $model;

    public function __construct($license, $driver, $brand, $model)
    {
        parent::__construct($license, $driver);
        $this->brand = $brand;
        $this->model = $model;

    }

    public function printDataCar(){
        parent::printDataCar();
        echo "<br>";
        echo "Marca: ".$this->brand." Model: ".$this->model;; 
    }

    
}

?>

Completado:

<?php

require_once('Car.php');

class UberX extends Car {
    public $brand;
    public $model;

    public function __construct($license, $driver, $brand, $model) {
        parent::__construct($license, $driver);
        $this->brand = $brand;
        $this->model = $model;
    }

    public function PrintDataCar(){
       parent::PrintDataCar();
       echo "
       Modelo: $this->model Marca: $this->brand
       ";
    }
}

?>

Para el que est茅 buscando el dato para Python:
https://www.programiz.com/python-programming/object-oriented-programming

class UberX extends Car {
    public $brand;
    public $model;

    public function __construct($license, $driver, $brand, $model){
        parent::__construct($license,$driver);
        $this->brand = $brand;
        $this->model = $model;
    }
	
    public function printDataCar() {
        parent::printDataCar();
        echo "Model: $this->model Marca:$this->brand Pasajeros: $this->passengers";
    }

}

Mi Reto con UberX

<?php

require_once('car.php');
class UberX extends Car
{
    public $brand;
    public $model;

    public function __construct($license, Account $driver, $brand, $model){

        parent::__construct($license, $driver);
        $this->brand = $brand;
        $this->model = $model;
    }

    public function printDataCar()
    {
        echo "Licencia: {$this->license} <br>Driver:{$this->driver->name} <br/>Number Passenger: {$this->passenger}
        <br/>Model: {$this->model}, <br/>Brand: {$this->brand}";

    }
}

?>

My practica de Getters y Setters en PHP

UberVan

<?php

require_once('car.php');
class UberVan extends Car
{   
    public $typeCarAccept;
    public $seatsMaterial;
    protected $passenger;

    public function __construct($license, $driver)
    {
        parent::__construct($license, $driver);

        // $this->typeCarAccept = $typeCarAccept;
        // $this->seatsMaterial = $seatsMaterial;
    }
    // GETTER Y SETTER
        // GETTER ID
    public function getId()
    {
        return $this->id;
    }    
        // SETTER ID
    public function setId($id) 
    {
        return $this->id = $id;
    }

        // GETTER LICENSE
    public function getLicense()
    {
        return $this->license;
    }
        // SETTER LICENSE
    public function setLicense($license) 
    {
        return $this->license = $license;
    }


    // GETTER DRIVER
    public function getDriver()
    {
        return $this->driver;
    }
    // SETTER DRIVER
    public function setDriver($driver) 
    {
        return $this->driver = $driver;
    }

    // GETTER PASSENGER
    public function getPassenger()
    {
        return $this->passenger;
    }

    /**
     * POLIMORFISMO SOBRE EL METODO setPassenger
     * Para aplicar polimorfismo, podemos sobreescribir el m茅todo dentro de la clase UberVan
     */
    public function setPassenger($passenger)
    {
        if ($passenger == 6) {
            $this->passenger = $passenger;
        }else {
            echo "Necesitas ingresar 6 pasajeros";
        }
    }

    
}

?>
<code> 
Mi clase Uber X
<?php
require_once('Car.php');
class UberX extends Car {
    protected $brand;
    protected $model;

    public function __construct($license,$driver,$brand,$model){
        /*forma de aplicar herencia en php*/
        parent::__construct($license,$driver);
        $this->model = $model;
        $this->brand = $brand;
    }

     //hacemos accesible la variable passenger con los getter and setters
     public function getPassenger() {
        return $this->passenger;
    }
    public function setPassenger($passenger){
        if($passenger == 4){
            //asignamos el valor passenger a parametro passenger
            $this->passenger = $passenger;

        }else{
            echo "Necesitas asignar 4 pasajeros<br>";
        }
    }

    public function printDataCar(){
        if($this->passenger != null){
        echo "Licencia $this->license <br>
        Driver: {$this->driver->name} <br>
        Numero de pasajeros: $this->passenger <br>
        Document: {$this->driver->document} <br>
        Marca: $this->brand <br>
        Modelo $this->model";
        }
    }
}
?>

Mi Index PHP
<?php
require_once('car.php');
require_once('uberX.php');
require_once('account.php');
require_once('uberPool.php');
require_once('uberVan.php');
require_once('driver.php');
require_once('user.php');


print("--------------------------------Datos Uber Van--------------------------------<br><br>");
$uberVan = new UberVan("GDJH55", new Account("Oscar Perez","AMSDF1243"),"Doge","RAM");
$uberVan->setPassenger(6);
$uberVan->printDataCar();

print("--------------------------------Datos Uber X--------------------------------<br><br>");
$uberX = new UberX("GDJH55", new Account("Oscar Gonzalez","OGZ4488"),"Nissan","Versa");
$uberX->setPassenger(4);
$uberX->printDataCar();


?>
<?php
require_once ('car.php');
class UberX extends Car {
    public $brand;
    public $model;

    public function __construct($license, $driver, $brand, $model) {
        parent::__construct($license, $driver);
        $this->license = $license;
        $this->driver = $driver;
        $this->brand = $brand;
        $this->model = $model;
    }

    public function printDataCar() {
        parent::printDataCar();
        echo "
        Brand: $this->brand
        Model: $this->model
        <br/>";
    }
}
<?php
require_once('car.php');
class UberX extends Car{
    public $brand;
    public $model;

    public function __construct($license,$driver, $brand, $model){
        parent::__construct($license,$driver);
        $this->brand = $brand;
        $this->model = $model;
    }

    public function printDataCar() {
        echo "
            Licencia: $this->license 
            Driver: {$this->driver->name} 
            N煤mero de pasajeros: $this->passenger
            Marca: $this->brand
            Modelo: $this->model
            
    
        ";
    }
}```
<?php
require_once('car.php');
class UberX extends Car {
    public $brand;
    public $model;

    public function __construct($license, $driver, $brand, $model){
        parent::__construct($license,$driver);
        $this->brand = $brand;
        $this->model = $model;
    }

    public function printDataCar() {
        parent::printDataCar();
        echo  "
        	Brand: $this->brand
       		Model: $this->model
        
        ";
    }
}
?>

gran curso profesora Rosa Morel

bien, voy bien

Mi aporte

<?php
namespace Clases;

class UberX extends Vehiculo{
protected $marca;
protected $modelo;

  public function __construct($lic,Cuenta $cuenta,$marca,$modelo){
	parent::__construct($lic,$cuenta);
	$this->setMarca($marca);
	$this->setModelo($modelo);
  } 

public function PrintVehiculo(){
$datos=[
	 "licencia"=>$this->licencia,
     "Cedula"=>$this->conductor->documento,
	 "Nombre"=>$this->conductor->nombre,
     "Pasajeros"=>$this->getPasajeros(), 		 
     "Marca"=>$this->marca,
     "Modelo"=>$this->modelo
	];
 echo json_encode($datos);
}
public function setMarca($marca){
	$lista=["HYUNDAI ATOS",
	        "CHERY QQ",
            "TAXIS"				
	];
	 if (in_array(upper($marca),$lista)==false){
		$this->marca=$marca; 
	 }else{
		echo "Uber no Acepta esta Marca en su Flota"; 
	 }
}

public function setModelo($modelo){
	 if ((int)($modelo)>=2010){
		$this->modelo=$modelo; 
	 }else{
		echo "Uber no Acepta estos Modelos en su Flota"; 
	 }
}	

}

<?php
//require_once 鈥淐uenta.class.php鈥;
namespace Clases;
//use \Clases\Cuenta;

class Vehiculo{
public $id;
public $licencia;
public $conductor;
protected $pasajeros;

public function __construct($lic, Cuenta $cuent){
 $this->licencia=$lic;
 $this->conductor=$cuent;
}

public function PrintVehiculo(){
	$datos=[
	 "licencia"=>$this->licencia,
     "Cedula"=>$this->conductor->documento,
	 "Nombre"=>$this->conductor->nombre         		 
	];
  return json_encode($datos);	
} 

public function getPasajeros(){
return $this->pasajeros;
}

public function setPasajeros($pasaj){
if($pasaj==4){
$this->pasajeros=$pasaj;
}else{
echo 鈥淣ecesitas 4 pasajeros鈥;
}
}
}

<?php
echo 鈥<!DOCTYPE html>
<html lang=鈥渆s鈥>
<head>
<meta charset=鈥淯TF-8鈥/>
<title>Instanciamiento en PHP</title>
</head>
<body>鈥;

require_once DIR."/vendor/autoload.php";
use \Clases\Cuenta;
use \Clases\UberX;

$vehi4=new UberX(鈥淲SX090鈥,new Cuenta(鈥淔elipe Torrente鈥,鈥7813456鈥),鈥淭oyota鈥,鈥2010鈥);
$vehi4->setPasajeros(4);
$vehi4->PrintVehiculo();

echo 鈥</body>
</html>鈥;

El resultado si todo es exitoso seria:

{
鈥渓icencia鈥: 鈥淲SX090鈥,
鈥淐edula鈥: 鈥7813456鈥,
鈥淣ombre鈥: 鈥淔elipe Torrente鈥,
鈥淧asajeros鈥: 4,
鈥淢arca鈥: 鈥淭oyota鈥,
鈥淢odelo鈥: 鈥2010鈥
}