tassoevan/prototype

PHP 的简单原型编程

2.0.0 2016-09-25 08:14 UTC

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 一样添加和删除。与 PrototypestdClass 之间的关键区别是后者不很好地处理可调用参数和闭包。你可以在 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() 调用。此静态方法是根据原型无法序列化的事实实现的,一旦它们存储了闭包。此外,它可以进行审查。

贡献

您可以随意进行分支并为此项目做出贡献。