tassoevan / prototype
PHP 的简单原型编程
Requires
- php: >=5.6
Requires (Dev)
- evert/phpdoc-md: ^0.2.0
- phpdocumentor/phpdocumentor: ^2.9
- phpdocumentor/reflection-docblock: ^2.0
- phpunit/phpunit: ^5.5
This package is not auto-updated.
Last update: 2024-09-25 17:05:50 UTC
README
PHP 的简单原型编程
原型编程是一种面向对象的编程风格,它通过类或接口提供的分类来处理对象。所有对象都可以通过 鸭子类型 来识别和区分。基本上,属性和方法是在运行时放入对象中,而不是在类中预先声明;继承是通过对象克隆和属性的动态插入来获得的。因此,父对象充当其子对象的 原型。
这允许你在编程时快速编码,在你对源代码进行结构更改的同时。然而,尽管对小型项目有益,但它可能会生成难以维护的应用程序。建议你首先使用原型来原型化应用程序模块,然后实现等效的传统基于类的结构。
安装
安装此包的推荐方法是使用 Composer。创建一个共同的 composer.json
文件并运行
$ composer require tassoevan/prototype
文档
基本用法
所有原型都是 TassoEvan\Prototype\Prototype
类的实例。属性可以像原生 stdClass
一样添加和删除。与 Prototype
和 stdClass
之间的关键区别是后者不很好地处理可调用参数和闭包。你可以在 Prototype
实例中像方法一样调用闭包。
<?php use TassoEvan\Prototype\Prototype; $obj = new Prototype(); $obj->a = function($x) { return $x + 2; }; $obj->a(2); // returns 4
此外,您还可以将 Prototype
实例用作闭包
<?php use TassoEvan\Prototype\Prototype; $obj = new Prototype(function($x) { return $x + 2; }); $obj(2); // returns 4
属性包装器
分配给 Prototype
实例的所有属性都包装在抽象类 TassoEvan\Prototype\Property
的实例中。可以通过显式实例化这些对象或从 TassoEvan\Prototype\Prototype
调用静态方法来完成,或者通过简单的赋值隐式包装 普通 属性。
显式实例化 TassoEvan\Prototype\Property
<?php use TassoEvan\Prototype\Prototype; use TassoEvan\Prototype\NormalProperty; $obj = new Prototype(); $obj->a = new NormalProperty('My value'); echo $obj->a; // outputs 'My value'
通过 TassoEvan\Prototype\Prototype
的静态方法显式实例化
<?php use TassoEvan\Prototype\Prototype; $obj = new Prototype(); $obj->a = Prototype::normal('My value'); echo $obj->a; // outputs 'My value'
隐式(仅适用于 TassoEvan\Prototype\NormalProperty
)
<?php use TassoEvan\Prototype\Prototype; $obj = new Prototype(); $obj->a = 'My value'; echo $obj->a; // outputs 'My value'
TassoEvan\Prototype\NormalProperty
一个 普通 属性可以像 PHP 中任何变量或对象的公共属性一样进行赋值、评估和调用(如果它是可调用的)。
<?php use TassoEvan\Prototype\Prototype; $obj = new Prototype(); $obj->a = 'My value'; echo $obj->a; // outputs 'My value' $obj->a = 'My new value'; echo $obj->a; // outputs 'My new value'
TassoEvan\Prototype\ReadOnlyProperty
一个 只读 属性不能被覆盖。在严格模式下,当进行新赋值时将抛出异常。
<?php use TassoEvan\Prototype\Prototype; $obj = new Prototype(); $obj->a = Prototype::readOnly('My value'); // non-strict echo $obj->a; // outputs 'My value' $obj->a = 'My new value'; echo $obj->a; // outputs 'My value' $obj->b = Prototype::readOnly('My value', true); // strict echo $obj->b; // outputs 'My value' $obj->b = 'My new value'; // a `UnexpectedValueException`
TassoEvan\Prototype\LazyProperty
一个 延迟加载 属性具有 延迟加载 的能力:第一次尝试获取值(或调用它)时,将调用一个名为 loader 的可调用对象来生成属性值,该值将被存储。加载后,属性的行为就像一个普通属性。
<?php use TassoEvan\Prototype\Prototype; $obj = new Prototype(); $obj->db = Prototype::lazy(function() use($myDSNString) { // connected only when used return new PDO($myDSNString); }); $obj->db->exec('UPDATE poke_registry SET pokes = pokes+1'); // connects to database and performs a query
TassoEvan\Prototype\ProxyProperty
TassoEvan\Prototype\DynamicProperty
一个 动态 属性没有存储的值:您应该定义一个获取器和设置器的可调用对象来提供一些值。它可以用于表示或作为服务提供程序和容器的外观。
<?php use TassoEvan\Prototype\Prototype; $obj = new Prototype(); $obj->a = Prototype::dynamic(function() { return "foo"; }, function($value) { echo "Do you want to set {$value} to this property?"; }); echo $obj->a; // outputs "foo" $obj->a = 3; // outputs "Do you want to set 3 to this property?"
其他功能
Prototype::closure($callable)
:将任何可调用对象转换为可以传递给Prototype
实例的闭包Prototype::data(Prototype $obj)
:创建一个数组,包含您原型存储或 生成 的所有数据:这意味着将执行Prototype::dynamic()
和Prototype::lazy()
调用。此静态方法是根据原型无法序列化的事实实现的,一旦它们存储了闭包。此外,它可以进行审查。
贡献
您可以随意进行分支并为此项目做出贡献。