sagittaracc / php-python-decorator
Python style decorator for PHP
v6.4.2
2024-04-22 13:44 UTC
Requires
- sagittaracc/placeholder: ^0.3
Requires (Dev)
- phpunit/phpunit: ^9.5
- dev-main
- v6.4.2
- v6.4.1
- v6.4.0
- v6.3.0
- v6.2.1
- v6.1.1
- v6.1.0
- v6.0.0
- v5.0.0
- v4.3.3
- v4.3.2
- v4.3.1
- v4.3.0
- v4.2.2
- v4.2.1
- v4.2.0
- v4.1.0
- v4.0.1
- v4.0.0
- v3.0.2
- v3.0.1
- v3.0.0
- v2.0.1
- v2.0.0
- v1.14.1
- v1.13.1
- v1.12.5
- v1.12.4
- v1.12.3
- v1.12.2
- v1.12.1
- v1.12.0
- v1.11.1
- v1.10.1
- v1.10.0
- v1.9.0
- v1.8.1
- v1.8.0
- v1.7.0
- v1.6.0
- v1.5.0
- v1.4.0
- v1.3.0
- v1.2.0
- v1.1.0
- v1.0.0
This package is auto-updated.
Last update: 2024-10-23 12:05:48 UTC
README
Python style decorators for PHP
Requirements
PHP 8.1 or higher
Install
composer require sagittaracc/php-python-decorator
Example
How long it takes to run a method. See the Timer
decorator
use Sagittaracc\PhpPythonDecorator\Decorator; class Calc { use Decorator; #[Timer] function sum($a, $b) { sleep(1); return $a + $b; } }
This is how you can call it
$calc = new Calc(); echo call_decorator_func_array([$calc, 'sum'], [1, 2]); // Total execution: 1.00034234 ms; Result: 3
Or inline
$timerOnSum = (new Timer)->wrapper(fn($a, $b) => $calc->sum($a, $b)); echo $timerOnSum(1, 2); // Total execution: 1.00034234 ms; Result: 3
Generics
use Sagittaracc\PhpPythonDecorator\Decorator; use Sagittaracc\PhpPythonDecorator\modules\generics\aliases\T; use Sagittaracc\PhpPythonDecorator\modules\validation\core\validators\ArrayOf; #[T] class Box { use Decorator; #[ArrayOf(T::class)] public $items; public function addItem(#[T] $item) { $this->items[] = $item; } } $box = new Box(); $box(Pen::class); // new Box<Pen>(); call_decorator_func_array([$box, 'addItem'], [new Pencil]); // throws a GenericError
Validation
use Sagittaracc\PhpPythonDecorator\Decorator; use Sagittaracc\PhpPythonDecorator\tests\examples\Progress; use Sagittaracc\PhpPythonDecorator\tests\validators\Length; use Sagittaracc\PhpPythonDecorator\tests\validators\SerializeOf; use Sagittaracc\PhpPythonDecorator\tests\validators\In; use Sagittaracc\PhpPythonDecorator\tests\validators\LessThan; use Sagittaracc\PhpPythonDecorator\tests\validators\UInt8; class Progress { use Decorator; #[UInt8] public $max; #[UInt8] #[LessThan('max')] public $pos; #[In('progress', 'finish', 'aborted')] public $status; #[Length(32)] public string $caption; } $progress = new Progress(); set_decorator_prop($progress, 'max', 255); // max uint8 - 255 set_decorator_prop($progress, 'pos', 100); // should be less than max set_decorator_prop($progress, 'status', 'progress'); // status is one of possible cases (progress, finish or aborted) set_decorator_prop($progress, 'caption', 'in progress ...'); // just a string (max length is 32)
Router
class Controller { use Decorator; #[Route('/hello')] #[Route('/hello/(\w+)')] function greetingPerson($name = 'guest') { return "Hello, $name"; } } // index.php (new Route('/hello/Yuriy'))->getMethod(Controller::class)->run(); // output: Hello, Yuriy
Console
use Sagittaracc\PhpPythonDecorator\Decorator; use Sagittaracc\PhpPythonDecorator\modules\console\core\Console; class Controller { use Decorator; #[Console('hello')] function greetingPerson($name) { return "Hello, $name"; } }
in the command line it would be calling for example something like this:
php index.php -c hello --name Yuriy
then in index.php
you should read the command and the parameters and after that call it like this:
(new Console('hello'))->setParameters(['name' => 'Yuriy'])->getMethod(Controller::class)->run();