programmazione

Symfony lezioni di base – Creare un Form come Classe

Nella lezione precedente abbiamo creato un form direttamente all’interno del controller, utilizzando lo schema:


class DefaultController extends Controller // estende la classe Controller di Symfony
{
	...
    
    public function newAction(Request $request)
   {
       ...

       // 1. creo i contenuti HTML del form
       $form = $this->createFormBuilder($task)

       ....

Il metodo ‘createFormBuilder()’ è utilizzato all’interno di ‘class DefaultController extends Controller’

Form come classe

Creare un form in una classe separata ci permette di riutilizzarlo più facilmente, lo schema di funzionanmento sarà

Il nostro controller invoca la classe contenente le istruzioni per creare il form: $form = $this->createForm(TaskType::class, $task);


public function newAction(Request $request)
   {
        ...

       // 1. creo i contenuti HTML del form
       // invia $task a TaskType.php classe TaskType
       $form = $this->createForm(TaskType::class, $task);

        ...

La Classe per creare il form TaskType.php:


...

class TaskType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('task')
            ->add('dueDate', null, array('widget' => 'single_text'))
            ->add('save', SubmitType::class)
...

Il codice completo

src/AppBundle/Controller/DefaultController.php


<?php

// src/AppBundle/Controller/DefaultController.php
namespace AppBundle\Controller;

use AppBundle\Entity\Task; // carica Task.php creato da me
use AppBundle\Form\TaskType; // carica TaskType.php creato da me

use Symfony\Component\HttpFoundation\Request; // capacità do renderizzare html render()

use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;// NECESSARIO per utilizzare @Route

use Symfony\Bundle\FrameworkBundle\Controller\Controller; // il bundle controller Symfony per usare createForm()

class DefaultController extends Controller // deve estendere Controller
{
	/**
	* @Route("/form")
	*/
    
    public function newAction(Request $request)
   {
       // creo il nuovo oggetto 
       $task = new Task();
       // die("interrompi qui"); // debug

       // 1. creo i contenuti HTML del form
       // invia $task a TaskType.php classe TaskType
       $form = $this->createForm(TaskType::class, $task);
       
       // 3. riconosce che il form non è stato inviato e non fa nulla
       $form->handleRequest($request); 
       
       // 4. se il form è inviato AND valido
       if ($form->isSubmitted() && $form->isValid()) {
           // $form->getData() holds the submitted values
           // but, the original `$task` variable has also been updated
           $task = $form->getData();// ottieni i dati dal form

           // die ("interrompi qui 2");
           // ... perform some action, such as saving the task to the database
           // for example, if Task is a Doctrine entity, save it!
           // $em = $this->getDoctrine()->getManager();
           // $em->persist($task);
           // $em->flush();

           // alla fine fai redirect all'esterno 
           return $this->redirect('http://www.lucedigitale.com');
           
           // oppure verso una @Route di Symfony
           //return $this->redirectToRoute('homepage');
       }

       // 2. Il form viene creato e renderizzato
       return $this->render('default/new.html.twig', array(
           'form' => $form->createView(),
       ));
   }
}

src/AppBundle/Form/TaskType.php


<?php

// src/AppBundle/Form/TaskType.php
namespace AppBundle\Form;

use Symfony\Component\Form\AbstractType; // form astratto
use Symfony\Component\Form\FormBuilderInterface; // buildForm()
use Symfony\Component\Form\Extension\Core\Type\SubmitType; // SubmitType::class

class TaskType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('task')
            ->add('dueDate', null, array('widget' => 'single_text'))
            ->add('save', SubmitType::class)
        ;
    }
}

src/AppBundle/Entity/Task.php


<?php

// src/AppBundle/Entity/Task.php
namespace AppBundle\Entity;

use Symfony\Component\Validator\Constraints as Assert; // serve per @Assert\...

class Task // dichiarazione esplicita dell'oggetto
{
    
    /**
     * @Assert\NotBlank()
     * @Assert\EqualTo("Andrea")
     */
    public $task;    // cose da fare
    
     /**
     * @Assert\NotBlank()
     * @Assert\Type("\DateTime")
     */
    protected $dueDate; // scadenza

    
    // NB metodi get e set obbligatori per permettere a 'Form component' di symfony di funzionare correttamente
    public function getTask() // ottieni le cose da fare
    {
        return $this->task; // assegna il valore che proviene dall'istanza $this->
    }

    public function setTask($task) // setta le cose gda fare
    {
        $this->task = $task;
    }

    public function getDueDate() // ottieni la scadenza
    {
        return $this->dueDate;
    }

    public function setDueDate(\DateTime $dueDate = null) // setta la scadenza
    {
        $this->dueDate = $dueDate;
    }
}

app/Resources/views/default/new.html.twig


{# app/Resources/views/default/new.html.twig #}
{{ form_start(form) }}
{{ form_widget(form) }}
{{ form_end(form) }}

Come funziona?

0. al primo caricamento viene creato l’oggetto che contiene le mie variabili
$task = new Task();

1.
vengono creati i tag HTML per il form
$form = $this->createForm(TaskType::class, $task); -> punta alla Classe TaskType.php

Viene renderizzato il form render(‘default/new.html.twig’…

2. il metodo $form->handleRequest($request); rileva che il form non è stato inviato e non fa nulla

3. quando premo ‘submit’
– $form->handleRequest($request); ritorna TRUE
– i dati vengono salvati in $form e aggiornati in $task

a)
– $form viene controllato
– se non sono validi && $form->isValid()) { -> in realtà è una scorciatoia che significa $task->isValid())
– viene automaticamente renderizzata di nuovo la pagina con gli errori di validazione

b)
– $form viene controllato
– se sono validi && $form->isValid()) {
– viene inviata la richiesta POST alla pagina di provenieneza
– interrompe lo script con return facendo un redirect ad un’altra pagina, ad esempio di ringraziamento

NB: il redirect non darà la possibilità all’utente di fare “Refresh nel browser ed inviare di nuovo il form

Bibliografia:
symfony.com/doc/current/forms.html – Creating Form Classes

By |PHP, Symfony, Web Design|Commenti disabilitati su Symfony lezioni di base – Creare un Form come Classe

Form Inside Controller – Oggetto Render Validazione

Il Form component per Symfony è un componente standalone che può essere utilizzato anche al di fuori di Symfony.

In questa lezione creeremo un form direttamente all’interno di un Controller:


class DefaultController extends Controller // estende la classe Controller di Symfony
{
	...
    
    public function newAction(Request $request)
   {
       ...

       // 1. creo i contenuti HTML del form
       $form = $this->createFormBuilder($task)

       ....

Il metodo ‘createFormBuilder()’ è utilizzato all’interno di ‘class DefaultController extends Controller’

Form con Dummy Data

1. Creare in src/AppBundle/Entity/Task.php


<?php

/// src/AppBundle/Entity/Task.php
namespace AppBundle\Entity;

class Task // dichiarazione esplicita dell'oggetto
{
    // proprietà o variabili non accessibile dall'esterno della classe
    protected $task;    // cose da fare
    protected $dueDate; // scadenza

    
    // NB metodi get e set obbligatori per permettere a 'Form component' di symfony di funzionare correttamente
    public function getTask() // ottieni le cose da fare
    {
        return $this->task; // assegna il valore che proviene dall'istanza $this->
    }

    public function setTask($task) // setta le cose gda fare
    {
        $this->task = $task;
    }

    public function getDueDate() // ottieni la scadenza
    {
        return $this->dueDate;
    }

    public function setDueDate(\DateTime $dueDate = null) // setta la scadenza
    {
        $this->dueDate = $dueDate;
    }
}

2. Creare in src/AppBundle/Controller/DefaultController.php


<?php

// src/AppBundle/Controller/DefaultController.php
namespace AppBundle\Controller;

use AppBundle\Entity\Task; // carica Task.php creato da me
use Symfony\Bundle\FrameworkBundle\Controller\Controller; // il bundle controller Symfont
use Symfony\Component\HttpFoundation\Request; // capacità do renderizzare html
use Symfony\Component\Form\Extension\Core\Type\TextType; // form di Symfony
use Symfony\Component\Form\Extension\Core\Type\DateType;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;

use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;// NECESSARIO per utilizzare @Route

class DefaultController extends Controller // estende la classe Controller di Symfony
{
	/**
	* @Route("/form")
	*/
    public function newAction(Request $request) // metodo
    {
        // Utilizzo della classe Task di Task.php per creare l'oggetto $task INIZIO -> crea $task
        $task = new Task();// creo un oggetto istanziando la classe Task
        $task->setTask('Write a blog post'); // assegno $task, le cose da fare
        $task->setDueDate(new \DateTime('tomorrow')); // setta la scadenza
        // Utilizzo della classe Task di Task.php per creare l'oggetto $task FINE

        // Creazione del form utilizzando le classi di Symfony INIZIO -> crea $form
        $form = $this->createFormBuilder($task)// invia al metodo createFormBuilder l'oggetto $task con tutte i dati
            // istruzioni per creare i TAG HTML INIZIO
            ->add('task', TextType::class)// invia al metodo add() assegnando la propietà 'task' di Task.php e la variabile statica 'TextType::class' che indica un campo di testo
            ->add('dueDate', DateType::class)// come sopra
            ->add('save', SubmitType::class, array('label' => 'Create Post'))// come sopra con aggiunta della label
            // istruzioni per creare i TAG HTML FINE
            ->getForm(); // questo metodo di Symfony restituisce il form
        // Creazione del form utilizzando le classi di Symfony FINE

        // ivia l'istruzione al template .twig inviando $form
        // la risposta finale è invio al metodo render() - template.twig - form - $form
        return $this->render('default/new.html.twig', array(
            'form' => $form->createView(),
        ));
    }
}

2. Creare in app/Resources/views/default/new.html.twig


{# app/Resources/views/default/new.html.twig #}
{{ form_start(form) }}
{{ form_widget(form) }}
{{ form_end(form) }}

Puntare il browser su: http://localhost/symfonytest/first_test_symfony/web/form

Come funziona?
Si avvia DefaultController.php:
1. Crea l’oggetto $task instanziando in Task.php la class Task
2. Crea l’oggetto $form con il metodo createFormBuilder() di Symfony
3. Renderizza il form inviandolo al template ,twig con il metodo render() di Symfony

NB: – $task = new Task(); – sono dummy data – dati di esempio!!!

Form senza Dummy Data

Ripuliamo dai dati generati come esempio matenendo solo il form


<?php

// src/AppBundle/Controller/DefaultController.php
namespace AppBundle\Controller;

use AppBundle\Entity\Task; // carica Task.php creato da me
use Symfony\Bundle\FrameworkBundle\Controller\Controller; // il bundle controller Symfont
use Symfony\Component\HttpFoundation\Request; // capacità do renderizzare html
use Symfony\Component\Form\Extension\Core\Type\TextType; // form di Symfony
use Symfony\Component\Form\Extension\Core\Type\DateType;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;

use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;// NECESSARIO per utilizzare @Route

class DefaultController extends Controller // estende la classe Controller di Symfony
{
	/**
	* @Route("/form")
	*/
    
    public function newAction(Request $request)
   {
       // creo il nuovo oggetto 
       $task = new Task();
       // die("interrompi qui"); // debug

       // 1. creo i contenuti HTML del form
       $form = $this->createFormBuilder($task)
           ->add('task', TextType::class) // il nome delle varibili è lo stesso di Task.php
           ->add('dueDate', DateType::class)
           ->add('save', SubmitType::class, array('label' => 'Create Task'))
           ->getForm();
       
       // 3. riconosce che il form non è stato inviato e non fa nulla
       $form->handleRequest($request); 
       
       // 4. se il form è inviato AND valido
       if ($form->isSubmitted() && $form->isValid()) {
           // $form->getData() holds the submitted values
           // but, the original `$task` variable has also been updated
           $task = $form->getData();// ottieni i dati dal form

           // die ("interrompi qui 2");
           // ... perform some action, such as saving the task to the database
           // for example, if Task is a Doctrine entity, save it!
           // $em = $this->getDoctrine()->getManager();
           // $em->persist($task);
           // $em->flush();

           // alla fine fai redirect all'esterno 
           return $this->redirect('http://www.lucedigitale.com');
           
           // oppure verso una @Route di Symfony
           //return $this->redirectToRoute('homepage');
       }

       // 2. Il form viene creato e renderizzato
       return $this->render('default/new.html.twig', array(
           'form' => $form->createView(),
       ));
   }
}

Puntare il browser su: http://localhost/symfonytest/first_test_symfony/web/form

Come funziona?

0. al primo caricamento viene creato l’oggetto che contiene le mie variabili
$task = new Task();

1.
vengono creati i tag HTML per il form
$form = $this->createFormBuilder($task)

Viene renderizzato il form render(‘default/new.html.twig’…

2. il metodo $form->handleRequest($request); rileva che il form non è stato inviato e non fa nulla

3. quando premo ‘submit’
– $form->handleRequest($request); ritorna TRUE
– i dati vengono salvati in $form e aggiornati in $task

a)
– $form viene controllato
– se non sono validi && $form->isValid()) {
– viene automaticamente renderizzata di nuovo la pagina con gli errori di validazione

b)
– $form viene controllato
– se sono validi && $form->isValid()) {
– viene inviata la richiesta POST alla pagina di provenieneza
– interrompe lo script con return facendo un redirect ad un’altra pagina, ad esempio di ringraziamento

NB: il redirect non darà la possibilità all’utente di fare “Refresh nel browser ed inviare di nuovo il form

Validazione

Come visto sopra $form->isValid() è una scorciatoia per scrivere $task->isValid()
Il controllo di validazione quindi verrà effettuato su direttamente sull’oggetto e non sul form come si fa di solito in HTML

Modifichiamo Task.php che contiene il nostro oggetto:


<?php

/// src/AppBundle/Entity/Task.php
namespace AppBundle\Entity;

use Symfony\Component\Validator\Constraints as Assert; // serve per @Assert\...

class Task // dichiarazione esplicita dell'oggetto
{
    
    /**
     * @Assert\NotBlank()
     * @Assert\EqualTo("Andrea")
     */
    public $task;    // cose da fare
    
     /**
     * @Assert\NotBlank()
     * @Assert\Type("\DateTime")
     */
    protected $dueDate; // scadenza

    
    // NB metodi get e set obbligatori per permettere a 'Form component' di symfony di funzionare correttamente
    public function getTask() // ottieni le cose da fare
    {
        return $this->task; // assegna il valore che proviene dall'istanza $this->
    }

    public function setTask($task) // setta le cose gda fare
    {
        $this->task = $task;
    }

    public function getDueDate() // ottieni la scadenza
    {
        return $this->dueDate;
    }

    public function setDueDate(\DateTime $dueDate = null) // setta la scadenza
    {
        $this->dueDate = $dueDate;
    }
}

Notare:

– l’utilizzo del namspace

use Symfony\Component\Validator\Constraints as Assert;

– la notazione per la validazione:


     /**
     * @Assert\NotBlank()
     * @Assert\EqualTo("Andrea")
     */

Per $task verrà accettato solamente un campo non vuoto ed uguale ad “Andrea”
Se tento di inviare un campo vuoto o diverso da “Andrea” sarà restituito il controllo di validazione

Si può consultare la lista completa dei controlli di validazione a:
symfony.com/doc/current/validation.html

Bibliografia:
symfony.com/doc/current/forms.html
symfony.com/doc/current/validation.html

By |PHP, Symfony, Web Design|Commenti disabilitati su Form Inside Controller – Oggetto Render Validazione

Symfony for Beginners – Home Pages and .twig Templates – Dev Setup

Create your First Home Page in Symfony

Environment Setup – Automatic Clear Cache

At the end of installation process will have: C:\wamp64\www\symfonytest>cd first_test_symfony

Inside the folder will be the folder structure of my project:
– app
– bin
– src
– tests
– var
– vendor
– web
– composer.json
– LICENSE etc…

Open your broser at: http://localhost/symfonytest/first_test_symfony/web/ to see the welcome page

Go to web\app.php and change the line:

$kernel = new AppKernel(‘prod’, false);

to

$kernel = new AppKernel(‘prod’, true);

This will activate – (‘prod’, true) – the production environment, this mean cache will not be saved, you can change file and reload in browser on the fly and see changes.

If – (‘prod’, false) – you can not reload from browser code changes

Go to var\cache\dev and var\cache\prod to see cache files for ‘dev’ and ‘prod’ environment.

Net Beans IDE

1. Run Net Beans IDE

2. File> New Project> PHP> PHp Application with Existing Sources> NEXT> Browse: C:\wamp64\www\symfonytest>first_test_symfony

HTML Render

1. Controller Request

Go to src\AppBundle\Controller\ -> here you will find all php codes for controllers
Open src\AppBundle\Controller\DeafaultController.php
Change the render page to indexmy.html.twig


return $this->render('default/indexmy.html.twig ...

2. .twig.html

Go to app\Resources\views\default\
and create indexmy.html.twig


{% extends 'base.html.twig' %}

{% block body %}
<h1>This is my first home page</h1>
{% endblock %}

{% block stylesheets %}
<style>
    h1 { font-size: 36px; }
</style>
{% endblock %}

Notice that {% extends ‘base.html.twig’ %}

Go to app\Resources\views\base.html.twig


<!DOCTYPE html>

<html>
    
<head>
<meta charset="UTF-8" />
        
<title> {% block title %}Welcome{% endblock %}</title>
        
	{% block stylesheets %}{% endblock %}
        
<link rel="icon" type="image/x-icon" href="{{ asset('favicon.ico') }}" />
    
</head>
    
<body>
        
	{% block body %}{% endblock %}
        
	{% block javascripts %}{% endblock %}
    
</body>

</html>

The process is:

return $this->render(‘default/indexmy.html.twig: -> call html.twig template -> extend base.html.twig

The rendered code inside the browser will be:


<!DOCTYPE html>
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8"><meta charset="UTF-8">
    <title>Welcome!</title>
	<style>
		h1 { font-size: 36px; }
	</style>
    <link rel="icon" type="image/x-icon" href="http://localhost/symfonytest/first_test_symfony/web/favicon.ico">
</head>
<body>
    <h1>This is my first home page</h1>
</body>
</html>

We can write:


{% extends 'base.html.twig' %}

{% block body %}
<h1>This is my first home page</h1>
<strong>Test</strong> HTML tags
<br>
<a href="http://www.lucedigitale.com">Visit Luce Digitale</a>
<br>
{% include 'my_code.html.twig' %}

{% endblock %}

{% block stylesheets %}
<style>
    h1 { font-size: 36px; }
</style>
{% endblock %}

Notice:
{% include ‘my_code.html.twig’ %} -> include a HTML code from a file in app\Resources\views\my_code.html.twig

Warning: you can not write native php code inside a .twig template, you need create an Extension Class (official docs at: http://symfony.com/doc/current/templating/twig_extension.html)

By |PHP, Symfony, Web Design|Commenti disabilitati su Symfony for Beginners – Home Pages and .twig Templates – Dev Setup

Symfony for Beginners – Installation on Windows Machine

What is Symfony? (https://symfony.com)
Symfony is a PHP web application framework and a set of reusable PHP components/libraries. Symfony was published as free software on October 18, 2005 and released under the MIT license.

Alternatives to Symfony are:
– Django (Python)
– Ruby on Rails (Ruby)

Let’s start!!!

WAMP INSTALLATION

1. First we need to install Apache, PHP and MySQL on our Windows Machine.
we can install them separately or installa a PHP development environment, that installs a ready to use environment. There are a lot of software for a dev PHP environment, the most popular are: WAMP XAMPP AMPPS. I will use WAMP.

a. Download WAMP at http://www.wampserver.com/en/#download-wrapper and launch the installer

b. Choose your .exe browser, I will use “C:\Program Files (x86)\Google\Chrome\Application\chrome.exe” because I love the tools for developers of this browser.

Choose yout txt editor, for me is: “C:\Program Files (x86)\Notepad++\notepad++.exe”

c. Open theWindows firewall ports

d. Config the mail() function of PHP

… or leave the default parameters

If installation succeed you will find WAMP options in the notification bar nera your clock.

The WAMP icon will be green: all services running

LMB on WAMP icon:
– Local Host
– phpMyAdmin etc…

RMB on WAMP icon:
– Wamp Settings
– tools
– exit etc…

To avoid conflicts in port 80 with Skype, open Skype> Strumenti> Opzioni> Avanzate> Connessione> uncheck ‘Usa le porte 80 e 443 per le connessioni in ingresso aggiuntive’

WAMP TEST SCRIPT

Now I will test WAMP.

– Click LMB WAMP icon> www directory
– Create here a ‘test’ folder and a test script ‘index.php’


<?php

$name = "Andrew";
echo "My name is " . $name;

?>

– open the browser and digit http://localhost/test/

– You can also LMB WAMP icon> localhost, you will find under ‘Your project’ the ‘test’ folder, but you can not run with a simple click, use the browser at http://localhost/test/ to do it!!!

WAMP phpMyAdmin

– Click LMB WAMP icon> localhost under ‘Tools’ tab phpmyadmin> user ‘root’, pass leave blank

or call with browser http://localhost/phpmyadmin/

SYMFONY INSTALLATION on WAMP with COMPOSER

1. https://getcomposer.org/

2. Download> https://getcomposer.org/Composer-Setup.exe

3. Run as Administrator

4. wamp64/bin/php/php7.0.10/ php.exe

5. Win button> cmd.exe> C:\Users\HAF922\composer and composer will run

START A PROJECT

1. Go to the project folder, example symfonytest> SHIFT+RMB> ‘Apri finestra di comando qui

2. Win button> cmd.exe> composer create-project symfony/framework-standard-edition first_test_symfony
You can use Copy/Paste Win standard function if you want.

3. Download and installation start.
database_host 127.0.0.1: ok is local host
database_port: 3306
database_name: symfony
database_user: root
database_password: 123

secret: 123456

At the end the prompt will have: C:\wamp64\www\symfonytest>cd first_test_symfony

Inside the folder will be the folder structure of my project:
– app
– bin
– src
– tests
– var
– vendor
– web
– composer.json
– LICENSE etc…

Open your broser at: http://localhost/symfonytest/first_test_symfony/web/

Grats!!!

NOTES for Bluehost users at point 3. uses settings similar to the following:

database_driver: pdo_mysql
database_host: localhost
database_port: ~
database_name: (cpanelUsername_databaseName)
database_user: (cpanelUsername_databaseUsername)
database_password: (whatever you picked)
Example:

database_driver: pdo_mysql
database_host: localhost
database_port: ~
database_user: joe1337
database_name: joe1337_sym1
database_password: eHTb7%Pxa9

By |PHP, Symfony, Web Design|Commenti disabilitati su Symfony for Beginners – Installation on Windows Machine

PHP Lezione Itermedia – Oggetti Classi Proprietà Metodi Istanze Costruttori Ereditarietà

PHP Lezione Itermedia – Oggetti Classi Proprietà Metodi Istanze Costruttori Distrutturi Ereditarietà Visibilità Overriding

Concetti intermedi nella programmazione ad oggetti in PHP

Let’s go on!

Creare Oggetti in PHP – Proprietà Dinamiche e Metodi Dinamici

Prima di tutto è necessario capire come funziona la programmazione ad oggetti in PHP.

Un oggetto è del codice che raccoglie delle variabili e le funzioni per processarle.

L’oggetto va dichiarato esplicitamente con la sintassi ‘class’.

Nel gergo della programmazione ad oggetti per essere precisi varibili e funzioni all’interno della classe sono indicati con una terminologia particolare, per essere più precisi:

– le variabili sono definiti proprietà o membri
– le funzioni sono definite metodi

La distinzione di nome è molto importante perchè mentre le normali variabili e funzioni sono componenti libere o di primo livello, le proprietà ed i metodi di una classe appartengono esclusivamente a questa classe (ed eventualmente alle classe che ereditano, come vedremo nelle successive lezioni).

Per richiamare e utilizzare una classe si usano le istanze o oggetti che vengono dichiarate con la sitassi ‘new’ ad esempio.

File1:


class MyClass { // dichiaro l'oggetto
 
        // variabili membro o meglio proprietà
        public $a = 10;
        public $b = 20;
         
        // funzioni o meglio metodi
        public function sayHello() {
                echo "Hello!";
        }
 
}

File2:


// DEVO dichiarare l'istanza, istanza cioè una copia di MyClass
$myClass_1 = new MyClass();
 
// richiama MyClass ed avvia la funzione sayHello() - stampa "Hello!"
$myClass_1->sayHello();
 
// richiama MyClass e preleva la variabile a - stampa 10
echo $myClass_1->a;

Per ogni classe può essere istanziato un numero illimitato di oggetti, ed inviare parametri:


$myClass_2 = new MyClass();
 
// ora la proprietà "a" dell'oggetto $myClass_2 è impostata a 20
$myClass_2->a = 20; // invia un valore ad a
 
// stampa 10
echo $myClass_1->a;

L’oggetto può essere dichiarato con le parentesi se vogliamo usare un costruttore pubblico nella classe
o senza le parentesi se non vogliamo usare un costruttore pubblico nella classe, in questo caso non abbiamo modo di influire sui parametri della classe.


$myClass_1 = new MyClass();
$myClass_2 = new MyClass;

Per richiamare valori variabili dall’interno della classe utilizzeremo la keyword $this che si riferisce sempre all’istanza corrente che stiamo utilizzando, o meglio al valore che è stato inviato dall’istanza.


class MyClass {
 
        // variabili membro o proprietà
        public $a = 10;
        public $b = 20;
         
        // funzioni o metodi
        public function sayHello() {
                echo "Hello! " . $this->a . " " . $this->b;
        }
 
}
 
$myClass_1 = new MyClass();
$myClass_2 = new MyClass();

// stampa "Hello! 10 20", usa i valori indicati all'interno della classe perchè l'istanza non ha inviato nulla
$myClass_1->sayHello();
 
// ora la proprietà "a" dell'oggetto $myClass_2 è impostata a 20
$myClass_2->a = 20;
 
// stampa "Hello! 20 20" perchè usa $this->a cioè il valore 'a' che proviene dall'istanza
$myClass_2->sayHello()

I metodi di una classe riconoscono TUTTE le keyword appartenenti alla classe.

Costruttori

Possiamo decidere quale comportamento deve assumere l’oggetto quando viene creato utilizzando il metoto costruttore o metodo magico con la sintassi __construct (doppio underscore e construct)


class MyClass {
 
        // proprietà
        public $a = 10;
        public $b = 20;
         
        // costruttore o metodo magico
        public function __construct($a, $b) {
                $this->a = $a;
                $this->b = $b;
        }
         
        // metodi
        public function sayHello() {
                echo "Hello! " . $this->a . " " . $this->b;
        }
 
}
 
// creazione delle istanze, notare che i parametri verranno passati al costruttore
$myClass_1 = new MyClass(40, 40);
$myClass_2 = new MyClass("a", "b");

Il funzionamento è il seguente:
1. $myClass_1 = new MyClass(40, 40); è una istanza che invoca MyClass() ed invia 40,10
2. MyClass riceve in public function __construct($a, $b)
3. Che assegna il valore alla variabile in base al valore ricevuto dall’istanza $this->a = $a;
4. sayHello() scrive Hello 40 40

Ovviamente in questo caso, non possiamo omettere i parametri nella fase di creazione delle istanze, altrimenti PHP genererebbe un E_WARNING che ci avvisa della mancata presenza dei parametri richiesti dal costruttore.

Controlli sui Costruttori

Sarà possibile inserire dei controlli alla variabili inviate dall’istanza ad esempio:


class MyClass {
 
        // proprietà
        public $a = 10;
        public $b = 20;
         
        // costruttore
        public function __construct($a, $b) {
                // gli argomenti devono essere interi
                if(!is_int($a) || !is_int($b)) exit("The arguments must be integers!");
                // gli argomenti devono essere minori di 100
                if($a > 100 || $b > 100) exit("The arguments must be less than 100!");
                 
                $this->a = $a;
                $this->b = $b;
                 
                // connessione ad un nostro dataase interno
                connect_to_my_db($this->a, $this->b);
                 
                // operazioni...
        }
         
        // metodi ...
 
}
 
// creazione delle istanze
$myClass_1 = new MyClass(40, 80);               // ok
$myClass_2 = new MyClass("a", "b");             // errore: "The arguments must be integers!"

NOTARE:
if(!is_int($a) || !is_int($b)) exit(“The arguments must be integers!”);
if($a > 100 || $b > 100) exit(“The arguments must be less than 100!”);

Distruttori

Per distruggere gli oggetti si utilizza il metodo magico __destruct (doppio underscore destruct), il metodo __destruct NON ACCETTA argomenti.

Il metodo distruttore viene utilizzato per il clean up delle risorse, ad esempio per la chiusura del database.


class MyClass {
 
        // proprietà
        public $a = 10;
        public $b = 20;
         
        // costruttore
        public function __construct($a, $b) {
                $this->a = $a;
                $this->b = $b;
                 
        }
         
        // distruttore
        public function __destruct() {
                echo "__destruct method called!";
        }
 
}
 
// creazione delle istanze
$myClass_1 = new MyClass("username", "password");
$myClass_2 = new MyClass("username", "password");
$myClass_3 = new MyClass("username", "password");
$myClass_4 = $myClass_3;
 
// distruzione delle istanze
unset($myClass_1);              // stampa "__destruct method called"
$myClass_2 = 0;                 // stampa "__destruct method called"
 
unset($myClass_3);              // non chiama il distruttore, esiste ancora un riferimento all'oggetto $myClass_3

PHP chiama il metodo distruttore solo quando è davvero sicuro che tutti i riferimenti all’oggetto siano stati cancellati oppure quando l’oggetto è distrutto/cancellato manualmente con unset.
Inoltre tutti gli oggetti, come del resto tutte le variabili, vengono distrutti automaticamente da PHP al termine dello script.

Uso di __destruct per la chiusura del database:


class MyClass {
 
        // proprietà
        public $a = 10;
        public $b = 20;
         
        // costruttore
        public function __construct($a, $b) {
                $this->a = $a;
                $this->b = $b;
                 
                // connessione al database interno
                connect_to_my_db($this->a, $this->b);
        }
         
        // distruttore
        public function __destruct() {
                // operazioni di clean up...
                // chiusura del database e rilascio delle risorse
                free_my_db();
        }
         
        // metodi
        public function sayHello() {
                echo "Hello! " . $this->a . " " . $this->b;
        }
 
}
 
// creazione delle istanze
$myClass_1 = new MyClass("username", "password");

Proprietà Statiche

Le proprietà statiche si dichiarano attraverso la parola chiave (“static”)

Le proprietà statiche non appartengono a nessuna istanza in particolare, quindi non possono essere richiamate con l’operatore di deferenziamento (“->”)

Sono di fatto componenti statiche di proprietà della classe stessa e vengono richiamate con l’operatore di risoluzione (“::”) oppure con la keyword self.


class MyClass {
 
        // proprietà statiche
        public static $apples = 10;
        public static $pineapples = 20;
 
}
 
// stampa 10
echo MyClass::$apples;
 
// stampa 20
echo MyClass::$pineapples;

Le proprietà statiche possono cambiare il loro valore:


class MyClass {
 
        // proprietà statiche
        public static $instances = 0;
        public $idKey = false;
         
        // costruttore
        public function __construct() {
                $this->idKey = ++self::$instances;
                echo "This is the #" . $this->idKey 
		. " instance of the class MyClass.Instances created: " . $this->idKey;
        }
         
        // distruttore
        public function __destruct() {
                echo "Instance #" . $this->idKey . " deleted.";
        }
 
}
 
// stampa "This is the #1 instance of the class MyClass. Instances created: 1"
$myClass_1 = new MyClass();
 
// stampa "This is the #2 instance of the class MyClass. Instances created: 2"
$myClass_2 = new MyClass();
 
// stampa "This is the #3 instance of the class MyClass. Instances created: 3"
$myClass_3 = new MyClass();
 
// al termine dello script: "Instance #1 deleted.", "Instance #2 deleted.", "Instance #3 deleted."

Metodi Statici

I metodi statici sono dati di classe che non appartengono a nessuna istanza in particolare. Anch’essi devono essere preceduti dalla keyword ‘static’ e richiamati con ::


class MyClass {
 
        // metodi statici
        public static function sayHello() {
                echo "Hello!";
        }
         
        public static function sayHelloAgain() {
                self::sayHello(); // la sintassi è self:: per richiamare il metodo statico dall'interno della classe
                echo " Again!";
        }
 
}
 
// stampa "Hello!"
MyClass::sayHello();
 
// stampa "Hello! Again!"
MyClass::sayHelloAgain();

Eredietarietà

Tramite l’ereditarietà (inheritance), una classe (sottoclasse o classe figlia), può ereditare sia i metodi che le proprietà da un’altra classe (superclasse o classe padre). Per estendere una classe si utilizza la keyword ‘extends’


class MyClass {
 
        const A = 10;
         
        // proprietà
        public $a = 10;
         
        // metodi
        public function sayHello() {
                echo "Hello!";
        }
 
}
 
class AnotherClass extends MyClass {
         
        // proprietà
        public $b = 10;
 
}
 
$myClass = new MyClass();
 
// stampa (10)
echo $myClass->a;
 
// modifica
$myClass->a = 20;
 
// chiamata ("Hello!")
$myClass->sayHello();
 
$anotherClass = new AnotherClass();
 
// stampa (10)
$anotherClass->a; // notare che non è stata influenzata dalla modifica =20
 
// chiamata ("Hello!")
$anotherClass->sayHello();

Public Protected Private

Tramite l’utilizzo delle keyword – public – protected – private – (indicatori di visibilità) possiamo definire la visibilità delle proprietà e dei metodi di una classe, in particolare

public
– interno della classe stessa: accessibile/modificabile
– esterno della classe: accessibile/modificabile
– interno classe che la ereditano (extends): accessibile/modificabile

protected
– interno della classe stessa: accessibile/modificabile
– esterno della classe: non accessibile (Fatal Error)
– interno classe che la ereditano (extends): accessibile/modificabile

private
– interno della classe stessa: accessibile/modificabile
– esterno della classe: non accessibile (Fatal Error)
– interno classe che la ereditano (extends): non accessibile


class MyClass {
         
        // proprietà
        protected $a = 10;
         
        // metodi
        protected function sayHello() {
                echo "Hello!";
        }
 
}
 
class AnotherClass extends MyClass {
 
        public function sayHelloAgain() {
                $this->sayHello();
        }
 
}
 
$anotherClass = new AnotherClass();
 
// stampa "Hello!"
$anotherClass->sayHelloAgain();

//  Fatal Error
echo $myClass->a;
 
// Fatal Error
$myClass->sayHello();

// Fatal error
$anotherClass->sayHello();

// Fatal Error
$anotherClass->sayHelloAgain();

Overriding o Ridefinizione

Con l’Overriding o ridefinizione estendiamo una classe al fine di sovrascrivere il vecchio metodo con uno nuovo:


class A {
        public function sayHello() {
                echo "Hello!";        
        }
}
 
class B extends A {
        public function sayHello() {
                echo "Ciao Ciao!";    
        }
}
 
$b = new B();
 
// stampa "Ciao Ciao!"
$b->sayHello(); // il metodo con lo stesso nome più nuovo prende il posto di quello vecchio.

Overriding – parent –

Utilizzando la keyword – parent:: – possiamo sommare il risultato di due metodi con lo stesso nome


class A {
 
        public function sayHello() {
                echo "Hello!";        
        }
 
}
 
class B extends A {
 
        public function sayHello() {
                parent::sayHello();
                echo "Ciao Ciao!";    
        }
 
}
 
$b = new B();
 
// stampa "Hello! Ciao Ciao!"
$b->sayHello(); // il risultato è la somma dei due metodi

Un esempio di parent sul costruttore


class A {
        public function __construct($a, $b, $c, $d) {
                $this->a = $a;
                $this->b = $b;
                $this->c = $c;
                $this->d = $d;
        }
         
        // metodi...
 
}
 
class B extends A {
        public function __construct($a, $b, $c, $d, $e) {
                parent::__construct($a, $b, $c, $d);
                $this->e = $e;
        }
         
        // metodi...
 
}
 
$b = new B(10, 20, 30, 40, 50);
 
echo $b->a;  // stampa 10
echo $b->b;  // stampa 20
echo $b->c;  // stampa 30
echo $b->d;  // stampa 40
echo $b->e;  // stampa 50

Come funziona?
1. Creo un’istanza basata sulla classe B ‘$b = new B(10, 20, 30, 40, 50);’ ed inviando dei valori
2. ‘class B extends A’ invoca il costruttore della classe padre ‘parent::__construct($a, $b, $c, $d);’
3. La classe parent assegna con il suo costruttore i valori ricevuti alle variabili ‘function __construct($a, $b, $c, $d){$this->a = $a;’
4. echo visualizza i valori delle variabili

Impedire Overriding di Metodi e Classi – final –

Per garantire stabilità alle nostre gerarchie si può impedire l’Overridind dei metodì crucialiper il funzionamento della nostra applicazione.
Ad esempio potremo impedire la ridefinizione della classe per il collegamento al database o il parsing dei documenti.
Per fare questo utilizzaremo la keyword – final –

Per i metodi:


class MyClass {
        final public function connect_to_my_db() {
                // implementazione...
        }
         
        final public function parse_my_xml_doc() {
                // implementazione...
        }
         
        final public function sayHello() {
                echo "Hello!";
        }
}
 
$myClass = new MyClass();
 
// stampa "Hello!"
$myClass->sayHello();

// Fatal Error perchè sayHello() è stata dichiarata - final -
// NON POSSO FARE OVERRIDING
class AnotherClass extends MyClass {
        public function sayHello() {
                echo "Hello!";
        }
 
}

Per le classi:


final class MyClass {
        // implementazione...
} 

// Fatal Error: lass AnotherClass may not inherit from final class (MyClass)
lass AnotherClass extends MyClass {
        // implementazione...
}

Il mio sito ufficiale:
www.lucedigitale.com

Bibligrafia:
www.html.it/pag/18341/creare-le-classi/
www.html.it/pag/18353/impedire-loverriding-final/

By |PHP, Web Design|Commenti disabilitati su PHP Lezione Itermedia – Oggetti Classi Proprietà Metodi Istanze Costruttori Ereditarietà