<?php
interface WorldInterface {
function doAThing($foo);
}
class World implements WorldInterface {
public function __construct(string $name) {
$this->name = $name;
}
public function doAThing($foo) {
echo $foo;
}
}
class BackwardsWorld implements WorldInterface {
public function __construct(string $name) {
$this->name = strrev($name);
}
public function doAThing($foo) {
echo strrev($foo);
}
}
class Hello {
/**
* @var World
*/
private $world;
public function setWorld( WorldInterface $world ) {
$this->world = $world;
}
}
class WorldFactory {
// full disclosure: I'm still bad at factories
public static function makeWorld($name) {
return new World($name);
}
public static function makeDlrow($name) {
return new BackwardsWorld($name);
}
}
$hey = new Hello();
$hey->setWorld(WorldFactory::makeWorld('blorp'));
$yeh = new Hello();
$yeh->setWorld(WorldFactory::makeDlrow('blorp'));
var_dump($hey, $yeh);
Deprecated: Creation of dynamic property World::$name is deprecated in /in/cK3Wo on line 9
Deprecated: Creation of dynamic property BackwardsWorld::$name is deprecated in /in/cK3Wo on line 19
object(Hello)#1 (1) {
["world":"Hello":private]=>
object(World)#2 (1) {
["name"]=>
string(5) "blorp"
}
}
object(Hello)#3 (1) {
["world":"Hello":private]=>
object(BackwardsWorld)#4 (1) {
["name"]=>
string(5) "prolb"
}
}
Output for 8.3.5
Warning: PHP Startup: Unable to load dynamic library 'sodium.so' (tried: /usr/lib/php/8.3.5/modules/sodium.so (libsodium.so.23: cannot open shared object file: No such file or directory), /usr/lib/php/8.3.5/modules/sodium.so.so (/usr/lib/php/8.3.5/modules/sodium.so.so: cannot open shared object file: No such file or directory)) in Unknown on line 0
Deprecated: Creation of dynamic property World::$name is deprecated in /in/cK3Wo on line 9
Deprecated: Creation of dynamic property BackwardsWorld::$name is deprecated in /in/cK3Wo on line 19
object(Hello)#1 (1) {
["world":"Hello":private]=>
object(World)#2 (1) {
["name"]=>
string(5) "blorp"
}
}
object(Hello)#3 (1) {
["world":"Hello":private]=>
object(BackwardsWorld)#4 (1) {
["name"]=>
string(5) "prolb"
}
}
Catchable fatal error: Argument 1 passed to World::__construct() must be an instance of string, string given, called in /in/cK3Wo on line 41 and defined in /in/cK3Wo on line 8
Process exited with code 255.