Object Oriented PHP

Objects

JS: Objects linked to other objects

PHP: Objects instantiated from classes

Varför?

Struktur

Modularitet

Elephantys!

I JavaScript skapar vi objekt utifrån andra objekt

let elephant = {};
let elephant = Object.create({});

Allting är alltid kopplat till Object

I PHP skapar vi objekt utifrån classes

Liknar ES6-classes

<?php
class Elephant
{
             
}

Objects

When talking about objects, you refer to variables belonging to these objects as properties (or attributes or fields), and functions are called methods.

Class Method

<?php
class Elephant
{
  function speak(){
    echo "ERRRRUUUUH!!!!";
  }
}

Instantiering

Vi måste skapa ett objekt för att kunna använda metoderna i klassen

<?php
$hathi = new Elephant; //new keyword
$hathi->speak();  //ERRRRUUUUH!!!!

-> används för att komma åt egenskaper och metoder i objekt

<?php
class Elephant
{
  public $name = 'Hathi';
  function speak(){
    echo "ERRRRUUUUH!!!!";
  }
}
$hathi = new Elephant;
$hathi->name;

Constructor

<?php
class Elephant
{
  public $name; //public property

  public function __construct($name){
      $this->name = $name; //JS: this.name = name;
  }
}

Man måste inte ha public på konstruktorn

<?php
$hathi = new Elephant('Hathi');
$hathi->name; //Hathi

Private, Protected, Public

Privilegier

I PHP har vi olika nyckelord för åtkomst.

Principle of Least Privilege

Encapsulation

Inkapsling

Lägger samman sådant som hör ihop till samma objekt, minskar antalet globala variabler etc.

Information hiding: vi gömmer så mycket som möjligt, koden ska inte veta för mycket.

<?php
class Elephant
{
  public $name; //public property

  public function __construct($name){
      $this->name = $name; //Always public
  }
}

Kan kommas åt hur som helst, helgalet

<?php
class Elephant
{
  private $name; //private property

  public function __construct($name){
      $this->name = $name; //Always public
  }
}

Kan endast kommas åt från inuti klassen

Men vi måste komma åt $name

Oftast har man getter/setter

Funktioner som hämtar värden åt en

class Elephant
{
  private $name; //private property

  public function __construct($name){
      $this->name = $name; //Always public
  }
  public function getName(){
    return $this->name; //Only returns name
  }
}
//...
private $name;
public function getName(){
    return $this->name; //Only returns name
}
public function setName($name){
  if($name == ''){
    return 'No empty name!';
  }
  $this->name = $name;
} 

Vi bestämmer vem som kan komma åt värdena och hur värden kan sättas

  • private: bara egna klassen kan komma åt
  • public: alla kan komma åt
  • protected: klassen och alla klasser som ärver av klassen kan komma åt (återkommer till den imorgon)

Static

En metod kan vara bunden till klassen och inte till objektet.

Metoden kan användas utan att instatiera ett objekt

"Statiska" metoder i JavaScript

function Foo() {}; //constuctor
Foo.speak = function() { //Not bound to object
  console.log('Foooo!'); 
};
Foo.prototype.speak = function() { //Bound to object
  console.log('Foooo!'); //can reference 'this'
};

static keyword

<?php
class Elephant
{
  static function speak()
  {
    echo "ERRUUH!";
  }
}
<?php
Elephant::speak(); //'ERRUUH!'

Kan tala utan instans

<?php
class Elephant
{
  static public $name = "Hathi";
}
<?php
Elephant::$name; //'Hathi'

Kan ha ett namn utan instans

Imorgon: Inheritance

Idag: OOP Övningar