> Le 18 janv. 2023 à 19:33, Alex Wells <autau...@gmail.com> 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

Reply via email to