Grundsätzlich zu empfehlende Quellen:
Grundsätzlich wird eine neue Instanz via new Classname
erzeugt, dabei sind die
Klammern optional: new Classname()
.
Teilweise sieht man auch folgende Konstrukte:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 | class Singleton
{
/**
* @var Singleton The reference to *Singleton* instance of this class
*/
private static $instance;
/**
* Returns the *Singleton* instance of this class.
*
* @return Singleton The *Singleton* instance.
*/
public static function getInstance()
{
if (null === static::$instance) {
static::$instance = new static();
}
return static::$instance;
}
/**
* Protected constructor to prevent creating a new instance of the
* *Singleton* via the `new` operator from outside of this class.
*/
protected function __construct()
{
}
/**
* Private clone method to prevent cloning of the instance of the
* *Singleton* instance.
*
* @return void
*/
private function __clone()
{
}
/**
* Private unserialize method to prevent unserializing of the *Singleton*
* instance.
*
* @return void
*/
private function __wakeup()
{
}
}
class SingletonChild extends Singleton
{
}
$obj = Singleton::getInstance();
var_dump($obj === Singleton::getInstance()); // bool(true)
$anotherObj = SingletonChild::getInstance();
var_dump($anotherObj === Singleton::getInstance()); // bool(false)
var_dump($anotherObj === SingletonChild::getInstance()); // bool(true)
|
Source: https://phptherightway.com/pages/Design-Patterns.html
Damit werden Singletons implementiert. Singletons gelten allerdings als Anti-Pattern.
In TYPO3 gibt es noch folgende zwei Arten Instanzen von Klassen zu erzeugen:
1 2 3 4 5 6 | // Example 1
GeneralUtility::makeInstance(ExampleClassName::class);
// Example 2
GeneralUtility::makeInstance(ObjectManager::class)
->get(ExampleClassName::class);
|
Bei diesen Beispielen wird jeweils TYPO3 über eine API gebeten die Instanz zu erzeugen. Dadurch können alternative Implementierungen hinterlegt werden, und TYPO3 kann weitere Schritte unternehmen. So kann im 2. Beispiel die Dependency Injection getriggert werden. In beiden Fällen bietet TYPO3 bereits eine Implementierung für Singletons.
PHP bietet mittlerweile folgende Zugriffsbeschränkungen für Eigenschaften, Methoden und Konstanten (seit PHP 7.1.0):
public
protected
private
Weitere Infos findet man unter https://www.php.net/manual/en/language.oop5.visibility.php
Grundsätzlich sollte private
genutzt werden. Alles andere ist öffentliche API,
für Kindklassen oder externe Klassen. Somit ist jede Anpassung an der API, welche
Breaking ist, mit potenziellem Aufwand verbunden.
PSR-4 ist ein Standard der definiert wie Autoloading im Dateisystem, entsprechend eines Klassennamens ablaufen soll.
Dabei wird definiert dass der erste Teil des Namespaces dem Vendor entspricht. Dies
sollte ein eindeutiger Identifier sein. Typischerweise entspricht dies z.B. dem
Firmennamen oder einem Kürzel wie Codappix
oder Cdx
. Dieser Vendor definiert
wem der Code gehört und verhindert Duplikate.
Anschließend können beliebig viele Bereiche folgen, ehe der eigentliche Klassenname erscheint. Ein Beispiel:
namespace Codappix\CdxExampleExtension\Service\LinkBuildingService
Durch die Verwendung von Composer kann nun innerhalb der composer.json
definiert werden, dass das Paket dem PSR-4 folgt und auf welchen Ordner der Vendor
gemappt werden soll. Siehe Konfiguration autoloading.
z.B. (function (string $someString) { echo $someString; })(‚ein String‘); (optional)