


Constructor Prototype Pattern prototype pattern (PHP example), prototypepattern_PHP tutorial
Constructor Prototype Pattern prototype pattern (PHP example), prototypepattern
When most of a class is the same and only some parts are different, if a large number of objects of this class are needed, Repeatedly instantiating the same parts each time is expensive, and if you clone the same parts of the object before, you can save money.
An implementation method for PHP is to handle the initialization of this class separately with the __construct() and initialize functions. The prototype is placed in construct, which is the public part, and the special part of each object is placed in initialize. In this way, we first create a class without initializing it, and then clone this class and then initialize it every time.
This is mentioned in the zend framework official manual http://framework.zend.com/manual/2.0/en/user-guide/database-and-models.html, but it is not explained in detail. Let me analyze it below.
1. Introduction
There is an albumTable class in the zf2 model, which is equivalent to an assistant class for operating database actions, and tablegateway is used in it.
In order to initialize the albumtable with the same class every time, the initialization work is placed in getServiceConfig() of the module.php file in the root directory, which uses the factory mode, and through the callback function, when each ServiceManager ($sm ) will automatically create an alumTable when an object needs to be instantiated. We can see from the code below that creating an albumTable also requires creating an AlbumTableGateWay in the same way. This class uses the prototype pattern we are going to talk about.
2. Detailed code explanation
<span>public</span> <span>function</span><span> getServiceConfig() { </span><span>return</span> <span>array</span><span>( </span>'factories' => <span>array</span><span>( </span>'Album\Model\AlbumTable' => <span>function</span>(<span>$sm</span><span>) { </span><span>$tableGateway</span> = <span>$sm</span>->get('AlbumTableGateway'<span>); </span><span>$table</span> = <span>new</span> AlbumTable(<span>$tableGateway</span><span>); </span><span>return</span> <span>$table</span><span>; }</span>, 'AlbumTableGateway' => <span>function</span> (<span>$sm</span><span>) { </span><span>$dbAdapter</span> = <span>$sm</span>->get('Zend\Db\Adapter\Adapter'<span>); </span><span>$resultSetPrototype</span> = <span>new</span><span> ResultSet(); </span><span>$resultSetPrototype</span>->setArrayObjectPrototype(<span>new</span> Album());<span>//</span><span>这个就是一个不变的原型</span> <span>return</span> <span>new</span> TableGateway('album', <span>$dbAdapter</span>, <span>null</span>, <span>$resultSetPrototype</span>);<span>//</span><span>传入到TableGateWay的构造函数中去</span> },<span> )</span>,<span> ); }</span>
Note that it is not TableGateWay that uses the prototype pattern but the ResultSet class. Whenever the tablegateway calls methods such as select() or insert(), a ResultSet will be created to represent the result. The common parts of these ResultSets will be cloned, and unique partial classes such as data will be initialized.
3. More code examples
In order to understand this prototype more clearly, let’s put aside the big framework of zend and look at a complete code example. Example from
<a href="http://ralphschindler.com/2012/03/09/php-constructor-best-practices-and-the-prototype-pattern">PHP Constructor Best Practices And The Prototype Pattern</a>
The first half of this article about prototype pattern is actually a mixture of how to use inheritance in constructors to improve scalability. The two patterns may not seem easy to understand. Let’s look directly at the final code part about prototype pattern. .
<?<span>php </span><span>//</span><span>框架中很常见的adapter类,用来适配各种数据库,封装一些基本数据库连接操作。 //相当于上面代码中的adapter类</span> <span>class</span><span> DbAdapter { </span><span>public</span> <span>function</span> fetchAllFromTable(<span>$table</span><span>) { </span><span>return</span> <span>$arrayOfData</span><span>; } } </span><span>//</span><span>运用prototype pattern的类,注意construct和initialize是分开的 //相当于上面zend 代码里面的ResultSet类</span> <span>class</span><span> RowGateway { </span><span>public</span> <span>function</span> __construct(DbAdapter <span>$dbAdapter</span>, <span>$tableName</span><span>) { </span><span>$this</span>->dbAdapter = <span>$dbAdapter</span><span>; </span><span>$this</span>->tableName = <span>$tableName</span><span>; } </span><span>public</span> <span>function</span> initialize(<span>$data</span><span>) { </span><span>$this</span>->data = <span>$data</span><span>; } </span><span>/*</span><span>* * Both methods require access to the database adapter * to fulfill their duties </span><span>*/</span> <span>public</span> <span>function</span><span> save() {} </span><span>public</span> <span>function</span><span> delete() {} </span><span>public</span> <span>function</span><span> refresh() {} } </span><span>//</span><span>相当于上面代码中的TableGateway类,关于gateway可以具体去了解一下。</span> <span>class</span><span> UserRepository { </span><span>public</span> <span>function</span> __construct(DbAdapter <span>$dbAdapter</span>, RowGateway <span>$rowGatewayPrototype</span> = <span>null</span><span>) { </span><span>$this</span>->dbAdapter = <span>$dbAdapter</span><span>; </span><span>$this</span>->rowGatewayPrototype = (<span>$rowGatewayPrototype</span>) ? <span>new</span> RowGateway(<span>$this</span>->dbAdapter, 'user'<span>) } </span><span>public</span> <span>function</span><span> getUsers() { </span><span>$rows</span> = <span>array</span><span>(); </span><span>foreach</span> (<span>$this</span>->dbAdapter->fetchAllFromTable('user') <span>as</span> <span>$rowData</span><span>) { </span><span>$rows</span>[] = <span>$row</span> = <span>clone</span> <span>$this</span>-><span>rowGatewayPrototype; </span><span>$row</span>->initialize(<span>$rowData</span><span>); } </span><span>return</span> <span>$rows</span><span>; } }</span>
These classes actually correspond to the classes in the zend code above
Dbadapter -- adpater
RowGateWay -- ResultSet
UserRepository - TableGateWay
See the comments in the code for details.
The RowGateWay here can clearly see that a large number of instantiations are required in getusers, so the prototype mode is very necessary.
The following is the code to use this class
<span>class</span> ReadWriteRowGateway <span>extends</span><span> RowGateway { </span><span>public</span> <span>function</span> __construct(DbAdapter <span>$readDbAdapter</span>, DbAdapter <span>$writeDbAdapter</span>, <span>$tableName</span><span>) { </span><span>$this</span>->readDbAdapter = <span>$readDbAdapter</span><span>; parent</span>::__construct(<span>$writeDbAdapter</span>, <span>$tableName</span><span>); } </span><span>public</span> <span>function</span><span> refresh() { </span><span>//</span><span> utilize $this->readDbAdapter instead of $this->dbAdapter in RowGateway base implementation</span> <span> } } </span><span>//</span><span> usage:</span> <span>$userRepository</span> = <span>new</span><span> UserRepository( </span><span>$dbAdapter</span>, <span>new</span> ReadWriteRowGateway(<span>$readDbAdapter</span>, <span>$writeDbAdapter</span>, 'user'<span>) ); </span><span>$users</span> = <span>$userRepository</span>-><span>getUsers(); </span><span>$user</span> = <span>$users</span>[0]; <span>//</span><span> instance of ReadWriteRowGateway with a specific row of data from the db</span>

Hot AI Tools

Undresser.AI Undress
AI-powered app for creating realistic nude photos

AI Clothes Remover
Online AI tool for removing clothes from photos.

Undress AI Tool
Undress images for free

Clothoff.io
AI clothes remover

Video Face Swap
Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Article

Hot Tools

Notepad++7.3.1
Easy-to-use and free code editor

SublimeText3 Chinese version
Chinese version, very easy to use

Zend Studio 13.0.1
Powerful PHP integrated development environment

Dreamweaver CS6
Visual web development tools

SublimeText3 Mac version
God-level code editing software (SublimeText3)

Hot Topics

Alipay PHP...

JWT is an open standard based on JSON, used to securely transmit information between parties, mainly for identity authentication and information exchange. 1. JWT consists of three parts: Header, Payload and Signature. 2. The working principle of JWT includes three steps: generating JWT, verifying JWT and parsing Payload. 3. When using JWT for authentication in PHP, JWT can be generated and verified, and user role and permission information can be included in advanced usage. 4. Common errors include signature verification failure, token expiration, and payload oversized. Debugging skills include using debugging tools and logging. 5. Performance optimization and best practices include using appropriate signature algorithms, setting validity periods reasonably,

Session hijacking can be achieved through the following steps: 1. Obtain the session ID, 2. Use the session ID, 3. Keep the session active. The methods to prevent session hijacking in PHP include: 1. Use the session_regenerate_id() function to regenerate the session ID, 2. Store session data through the database, 3. Ensure that all session data is transmitted through HTTPS.

How to debug CLI mode in PHPStorm? When developing with PHPStorm, sometimes we need to debug PHP in command line interface (CLI) mode...

The application of SOLID principle in PHP development includes: 1. Single responsibility principle (SRP): Each class is responsible for only one function. 2. Open and close principle (OCP): Changes are achieved through extension rather than modification. 3. Lisch's Substitution Principle (LSP): Subclasses can replace base classes without affecting program accuracy. 4. Interface isolation principle (ISP): Use fine-grained interfaces to avoid dependencies and unused methods. 5. Dependency inversion principle (DIP): High and low-level modules rely on abstraction and are implemented through dependency injection.

How to automatically set the permissions of unixsocket after the system restarts. Every time the system restarts, we need to execute the following command to modify the permissions of unixsocket: sudo...

Sending JSON data using PHP's cURL library In PHP development, it is often necessary to interact with external APIs. One of the common ways is to use cURL library to send POST�...

Static binding (static::) implements late static binding (LSB) in PHP, allowing calling classes to be referenced in static contexts rather than defining classes. 1) The parsing process is performed at runtime, 2) Look up the call class in the inheritance relationship, 3) It may bring performance overhead.
