<?php
// define the common interface
interface StorageInterface {
function store($key, $value);
function retrieve($key);
}
// implement functionality common to descendants
abstract class Storage implements StorageInterface {
protected function normalizeKey($key) {
return $normalizedKey;
}
protected function someOtherUtilityFunction() {}
}
// concrete implementations
class S3 extends Storage {
protected $backend;
public function __construct(S3object $backend) {
$this->backend = $backend;
}
public function store($key, $value) {}
public function retrieve($key) {}
}
class DBX extends Storage {
protected $backend;
public function __construct(DBXobject $backend) {
$this->backend = $backend;
}
public function store($key, $value) {}
public function retrieve($key) {}
}
// maybe GCS is a completely different beast and can't/shouldn't descend from Storage
class GoogleCloudStorage implements StorageInterface {
protected $backend;
public function __construct(GCSobject $backend) {
$this->backend = $backend;
}
public function store($key, $value) {}
public function retrieve($key) {}
}
// so long as the object implements the interface we don't care about its parentage
class MyThingThatNeedsStorage {
public function __construct(StorageInterface $storage) {}
public function doSomething() {
$this->storage->retrieve('foo');
}
}
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