tasso/prototype

该包已废弃,不再维护。作者建议使用tassoevan/prototype包代替。

PHP的简单原型编程

2.0.0 2016-09-25 08:14 UTC

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一样添加和删除。与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

一个 动态 属性没有存储的值:您应该定义一个 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() 调用。这个静态方法是在考虑到原型无法序列化时实现的,因为它们存储了闭包。此外,可以进一步审查。

贡献

您可以自由地分支并为此项目做出贡献。