tasso / prototype
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: 2022-02-01 12:30:44 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
一个 动态 属性没有存储的值:您应该定义一个 getter 和 setter 可调用函数来提供一些值。可以用于表示或作为服务提供者和容器的外观。
<?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()
调用。这个静态方法是在考虑到原型无法序列化时实现的,因为它们存储了闭包。此外,可以进一步审查。
贡献
您可以自由地分支并为此项目做出贡献。