> Le 18 janv. 2023 à 19:33, Alex Wells <[email protected]> a écrit :
>
> Classes and methods is the expected way of implementing standard library in
> an OO language. New APIs (such as the new Random api) use OO instead of
> functions and it makes more sense to use OO in this case too: there's likely
> a place for other methods too, like toBase(int $otherBase) etc. It would also
> be possible to use overloaded operators if needed.
Fortunately, PHP is not (yet) a language where every problem requires the use
and manipulation of objects implementing a generalised and unified solution. I
guess that the OO way of writing:
```php
function next_alpha_id(): string {
static $x = 'zz';
return ++$x;
}
function next_num_id(): int {
static $x = 0;
return ++$x;
}
$my_id = next_alpha_id();
$my_other_id = next_num_id();
```
would resemble to the following, except that `mixed` should be replaced by the
use of generics. For brevity, I left the mandatory interfaces as exercise to
the reader.
```php
class IdGenerator {
protected mixed $current;
public function __construct(
protected readonly IdGeneratorType $type
, protected readonly IdGeneratorDirection $direction
, mixed $start
) {
$this->current = $start;
}
public function next(): mixed {
// implementation...
}
}
enum IdGeneratorType {
case alphabetic;
case numeric;
}
enum IdGeneratorDirection {
case positive;
case negative;
}
final class StandardGlobalAlphabeticIdGenerator {
private static IdGenerator $id_generator;
public static function get(): IdGenerator {
return self::$id_generator ?? new IdGenerator(
type: IdGeneratorType::alphabetic
, direction: IdGeneratorDirection::positive
, start: 'aaa'
);
}
}
final class StandardGlobalNumericIdGenerator {
private static IdGenerator $id_generator;
public static function get(): IdGenerator {
return self::$id_generator ?? new IdGenerator(
type: IdGeneratorType::numeric
, direction: IdGeneratorDirection::positive
, start: 1
);
}
}
$my_id = StandardGlobalAlphabeticIdGenerator::get()->next();
$my_other_id = StandardGlobalNumericIdGenerator::get()->next();
```
—Claude