JavascriptProva

martedì 1 maggio 2018

Alcune operazioni sulle stringhe in php.

Devo passare per le stringhe.
Vediamo... se ricordo bene, ci sono delle funzioni per contare il numero di caratteri di una stringa e il numero di parole contenute in essa.
strlen()
str_word_count()
Provo ad applicarle...

<?php
$stringa="Ciao bello vai a quel paese";
var_dump($stringa);
?>
string(27) "Ciao bello vai a quel paese"

Applichiamo le funzioni di cui sopra:
<?php
$stringa="Ciao bello vai a quel paese";
var_dump($stringa);
echo "<br>";
echo "Numero di caratteri della stringa ".strlen($stringa);
echo "<br>";
echo "Numero di parole della stringa ".str_word_count($stringa);
?> 
string(27) "Ciao bello vai a quel paese" 
Numero di caratteri della stringa 27
Numero di parole della stringa 6

Perfetto!
C'è anche una funzione che inverte la stringa, strrev().
Più una curiosità, direi... Proviamo:
<?php
$stringa="Ciao bello vai a quel paese";

echo "<br>";
echo "Numero di caratteri della stringa ".strlen($stringa);
echo "<br>";
echo "Numero di parole della stringa ".str_word_count($stringa);
echo "<br>";
echo "Stringa al contrario ".strrev($stringa);
?> 
Numero di caratteri della stringa 27
Numero di parole della stringa 6
Stringa al contrario eseap leuq a iav olleb oaiC
Sì, una simpatica curiosità!
Più interessanti sono le funzioni che cercano un testo all'interno di un altro testo e sostituiscono testo con altro testo.
Ne ho due, strpos() e str_replace().
Le provo...

<?php
$stringa="Nel mezzo del cammin di nostra vita mi ritrovai per una selva oscura che la diritta via era smarrita";

echo strpos($stringa,"cammin");
?>
14

Sì, corrisponde.
Ora con str_replace voglio sostituire alcune parole della frase.
<?php
$stringa="Nel mezzo del cammin di nostra vita mi ritrovai per una selva oscura che la diritta via era smarrita";

echo str_replace("selva oscura","cazzo di foresta buia che non si vedeva una minchia",$stringa);
?>
Nel mezzo del cammin di nostra vita mi ritrovai per una cazzo di foresta buia che non si vedeva una minchia che la diritta via era smarrita

Perfetto (chiedo perdono al Sommo...)

Overriding di un metodo e uso dell'operatore di scope per eseguire il metodo della classe base in php

Vediamo di fare un overriding di un metodo di una classe, e quindi di accedere al metodo della classe genitrice.

Inventiamo una classe...

Non ho ancora indagato se esistano in php le classi astratte.
Comunque, facciamo che la classe triangolo sia derivata della classe rettangolo, anche se ci starebbe meglio una classe astratta...

<?php

class rettangolo{
    private $area;
    private $base;
    private $altezza;
    
    function __construct($b, $a){
        $this->base=$b;
        $this->altezza=$a;
    }
    
    public function get_area(){
        return $this->base * $this->altezza;
    }
}

class triangolo extends rettangolo{
    function __construct($b,$a){
        $this->base=$b;
        $this->altezza=$a;
    }

    public function get_area(){
        return ($this->base * $this->altezza)/2;
    }
}

$myrect=new rettangolo(4,5);
echo "Area del rettangolo ".$myrect->get_area();
echo "<br>";
$mytrg=new triangolo(4,5);
echo "Area del triangolo ".$mytrg->get_area();
?> 
I risultati sono come mi attendo:
Area del rettangolo 20
Area del triangolo 10

Dunque ho overridato il metodo get_area().
Ora voglio usare l'operatore di scope (non so se anche in php si chiama così) per accedere al metodo della classe base.
<?php

class rettangolo{
    protected $base;
    protected $altezza;
    function __construct($b,$a){
        $this->base=$b;
        $this->altezza=$a;
    }
    
    public function get_area(){
        return $this->base * $this->altezza;;
    }
}

class triangolo extends rettangolo{

    function __construct($b, $a){
        $this->base=$b;
        $this->altezza=$a;
    }

    public function get_area(){
        return rettangolo::get_area();
    }
}

$myrect=new rettangolo(4,5);
echo "Area del rettangolo ".$myrect->get_area();
echo "<br>";
$mytrg=new triangolo(4,5);
echo "Area del triangolo ".$mytrg->get_area()
?> 
Area del rettangolo 20
Area del triangolo 20

Perfetto!

Classi in php: modificatori di accesso ed ereditarietà

Ecco, anche in PHP ci sono i modificatori di accesso public, private e protected.
Ma forse mi conviene vederli in blocco con l'ereditarietà.
Questo è il link di riferimento.

Eseguo pedissequamente o quasi...

Molto semplice e banale: questo è l'esempio che ho trovato sul tutorial
<?php
class person{
    var $name;
    public $height;
    protected $social_insurance;
    private $pinn_number;
    
    function __construct($persons_name){
        $this->name=$persons_name;
    }
    
    function set_name($new_name){
        $this->name=$new_name;
    }
    
    function get_name(){
        return $this->name;
    }
}

$stefan=new person("Stefan Mischook");
echo "Stefan's full name ".$stefan->get_name();
echo "Tell me private stuff: ".$stefan->pinn_number;
?> 
La variabile private non può venir letta da fuori della classe.
Comportamento del tutto analogo a ciò che accade in altri linguaggi OOP.

Ora vediamo l'ereditarietà.
<?php
class person{
    var $name;
    public $height;
    protected $social_insurance;
    private $pinn_number;
    
    function __construct($persons_name){
        $this->name=$persons_name;
    }
    
    public function set_name($new_name){
        $this->name=$new_name;
    }
    
    public function get_name(){
        return $this->name;
    }
}

class employee extends person{
    function __construct($employees_name){
        $this->name=$employees_name;
    }
}

$stefan=new person("Stefan Mischook");
$james=new employee("Johnny Fingers");

echo "----->".$james->get_name();

?>
----->Johnny Fingers

Bene. Abbiamo visto l'ereditarietà e i modificatori di accesso.
L'ultima cosa che devo vedere è l'overriding dei metodi (che comunque è uguale a quello che conosco da altri linguaggi OOP).

Mi introduco alle classi in PHP

Facciamo un po' di prove con il tipo di variabile Object, vale a dire il corrispettivo delle classi in altri linguaggi...

Le classi possono contenere in esse delle funzioni.
Ecco, ho trovato il modo di creare una classe con getter e setter di una proprietà.
Ci riprovo.
<?php
class Persona {
    var $nome;
    function set_name($newName){
        $this->nome=$newName;
    }
    
    function get_name(){
        return $this->nome;
    }
}

$Uomo=new Persona();
$Uomo->set_name("Mario");
echo $Uomo->get_name();

?> 
E funziona:
Mario

Vediamo se è possibile usare pure un costruttore...

<?php
class Persona {
    var $nome;
    function Persona($myName){
        $this->nome=$myName;
    }
    
}

$Uomo=new Persona("Joe Fetecchia");

echo $Uomo->nome;

?> 
Joe Fetecchia

Sì, si può usare anche il costruttore come negli altri linguaggi.
Ma il costruttore si può usare anche con questo costrutto:
<?php
class Persona {
    var $nome;
    function __construct($newName){
    $this->nome=$newName;
    }
}

$Uomo=new Persona("Pippo");

echo $Uomo->nome;

?> 
Pippo

Scope delle variabili in php

Mi sono esercitato su altri blog con le variabili php, ma è meglio che lo faccia qui perché per me il php è una novità, più che una cosa su cui esercitarsi.
L'ho già toccato distrattamente in passato, ma adesso lo scopro come una necessità piuttosto impellente.

Ho visto i tipi di variabili, perlomeno alcuni tipi di variabili, ma adesso è il caso che faccia uno studio generale.

Lo Scope è fondamentale.
Anche qui, come in JavaScript, esistono le funzioni.
Scrivo una funzione la chiamo, banalmente.
<?php

function funzione(){
    echo "Questa è una funzione";
}

funzione();
?> 
Sì, funziona esattamente come il JavaScript.

Detto questo, analizziamo lo scope.
<?php
$variabile=123;
function funzione(){
    echo $variabile;
}

funzione();
?>

Notice: Undefined variable: variabile in /storage/ssd3/737/3147737/public_html/index.php on line 4

La variabile dichiarata fuori dalla funzione non viene letta nella funzione.

variabile letta al di fuori di una funzione:
<?php
$variabile=123;
function funzione(){
    echo "funzione";
}

funzione();
echo $variabile;
?> 
funzione123



Allo stesso modo, la variabile dichiarata nella funzione non dovrebbe poter essere letta al di fuori.
Proviamo:
<?php

function funzione(){
    $variabile=123;
}

funzione();
echo $variabile;
?> 

Notice: Undefined variable: variabile in /storage/ssd3/737/3147737/public_html/index.php on line 8


...e dovrebbe venir letta all'interno della funzione:
<?php

function funzione(){
    $variabile=123;
    echo $variabile;
}

funzione();

?> 
123



Come faccio a leggere una variabile globale all'interno di una funzione?
Credo di aver capito che ci sono due modi:
  • mediante la parola chiave global;
  • mediante l'array $GLOBALS[index] in cui sono immagazzinate le variabili globali (in index va il nome della variabile).
Proviamo...

<?php
$variabile=123;
function funzione(){
    global $variabile;
    echo $variabile;
}

funzione();

?> 
123



Proviamo l'altro metodo:
<?php
$variabile=123;
function funzione(){
    
    echo $GLOBALS['variabile'];
}

funzione();

?> 
123

Perfetto!

giovedì 15 marzo 2018

Primo approccio con php

Ripeschiamolo, questo php.
<?php

echo "vaffanculo Antonello"

?> 
Questo è un codice estremamente rudimentale.
Lo metto nel file studio.php e lo spedisco sul server.

Vediamo...

vaffanculo Antonello


Sì, funziona.

giovedì 8 febbraio 2018

Creare una libreria "interna" in Android

Spinoso problema delle librerie android.
Il punto chiave è generare un .aar.

Iniziamo con: Click File > New > New Module.
In the Create New Module window that appears, click Android Library, then click Next.

Give your library a name and select a minimum SDK version for the code in the library, then click Finish.

L'ho chiamata Mia Libreria e l'SDK minimo è 17.

E' stata fatta la sincronizzazione di Gradle.
Il cambiamento della voce apply plugin sul modulo Gradle della libreria è già stato cambiato da c.antonello.studiojar3 a com.android.library.
Ora dovrei salvare il file.
Come?
Boh... faccio "Save All"...

Ma il passo completo è Save the file and click Tools > Android > Sync Project with Gradle Files. Vado a cliccare quanto dovuto...

Bene.
Ora se io clicco "build APK" dovrebbe generarmi un AAR...
Lo deduco da questo: When you want to build the AAR file, select the library module in the Project window and then click Build > Build APK


Proviamo...

Fatto, e vediamo se si è generato un AAR...

Non funziona.
La procedura che funziona per creare l'aar è invece
View -> Tool Windows -> Gradle
Sulla finestra di gradle che si apre a destra si va su mialibreria -> Tasks -> assemble, e si generano due aar: una versione debug e una versione release.

Ora il problema è come usare queste librerie.
Ora, dato che la libreria fa parte di questo progetto, posso fare direttamente questo:
Make sure the library is listed at the top of your settings.gradle file, as shown here for a library named "my-library-module":
include ':app', ':my-library-module'
include ':app', ':mialibreria'
Confermato!
Open the app module's build.gradle file and add a new line to the dependencies block as shown in the following snippet:
dependencies {
    compile project(":my-library-module")
}
Vediamo:
dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'com.android.support:appcompat-v7:26.1.0'
    implementation 'com.android.support.constraint:constraint-layout:1.0.2'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.1'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1'
    compile project(":mialibreria")
}
Vediamo se sincronizza...

Ha sincronizzato.

Ora, nella mia libreria ho messo un codice estremamente fesso per fare la prova:
public class Classe {
    public Classe(){}
    public void Scrivi(){
        System.out.println("Ciao");
    }
}
Vediamo se si riesce a inserire la funzione.
No.


Anziché modificare manualmente il file app Gradle (parte che ho scritto in rosso) si può procedere con File -> Project Structure
Quindi si seleziona la scheda Dependencies e si aggiunge con il + il riferimento alla libreria.
Il file Gradle app si modifica così:
dependencies {
    implementation fileTree(include: ['*.jar'], dir: 'libs')
    implementation 'com.android.support:appcompat-v7:26.1.0'
    implementation 'com.android.support.constraint:constraint-layout:1.0.2'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.1'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1'
    implementation project(':mialibreria')
}
compile è deprecato, l'uso più moderno è di implementation.