├── EXPERIMENTAL ├── CREDITS ├── _config.yml ├── travis ├── compile.sh └── run-test.sh ├── facade ├── os_interface.h ├── bios_interface.h ├── linux_os.h ├── bios.h ├── facade.h ├── os_interface.c ├── bios_interface.c ├── linux_os.c ├── bios.c └── facade.c ├── adapter ├── book.h ├── book_interface.h ├── ebook_interface.h ├── kindle.h ├── ebook_adapter.h ├── book_interface.c ├── ebook_interface.c ├── book.c ├── kindle.c └── ebook_adapter.c ├── abstractFactory ├── abstract_factory.h ├── mac_factory.h ├── win_factory.h ├── abstract_factory.c ├── mac_factory.c └── win_factory.c ├── commander ├── command_interface.h ├── invoker.h ├── undoable_command_interface.h ├── hello_command.h ├── receiver.h ├── add_message_date_command.h ├── command_interface.c ├── undoable_command_interface.c ├── invoker.c ├── receiver.c ├── hello_command.c └── add_message_date_command.c ├── bridge ├── formatter_interface.h ├── html_formatter.h ├── service.h ├── hello_world_service.h ├── plain_text_formatter.h ├── formatter_interface.c ├── service.c ├── html_formatter.c ├── plain_text_formatter.c └── hello_world_service.c ├── dependencyInjection ├── database_connection.h ├── database_configuration.h ├── database_connection.c └── database_configuration.c ├── .travis.yml ├── tests ├── 001.phpt ├── 005.phpt ├── 003.phpt ├── 004.phpt ├── 002.phpt └── 006.phpt ├── config.w32 ├── .gitignore ├── README.md ├── php_design_patterns.php ├── php_design_patterns.h ├── config.m4 ├── php_design_patterns.c └── LICENSE /EXPERIMENTAL: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /CREDITS: -------------------------------------------------------------------------------- 1 | php_design_patterns -------------------------------------------------------------------------------- /_config.yml: -------------------------------------------------------------------------------- 1 | theme: jekyll-theme-minimal -------------------------------------------------------------------------------- /travis/compile.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | phpize && ./configure && make clean && make 3 | -------------------------------------------------------------------------------- /facade/os_interface.h: -------------------------------------------------------------------------------- 1 | #ifndef OS_INTERFACE_H 2 | #define OS_INTERFACE_H 3 | static zend_class_entry *os_interface_ce; 4 | PHP_DESIGN_STARTUP_FUNCTION(os_interface); 5 | #endif 6 | -------------------------------------------------------------------------------- /adapter/book.h: -------------------------------------------------------------------------------- 1 | #ifndef BOOK_H 2 | #define BOOK_H 3 | PHP_METHOD(book, open); 4 | PHP_METHOD(book, turnPage); 5 | PHP_METHOD(book, getPage); 6 | PHP_DESIGN_STARTUP_FUNCTION(book); 7 | #endif 8 | -------------------------------------------------------------------------------- /adapter/book_interface.h: -------------------------------------------------------------------------------- 1 | #ifndef BOOK_INTERFACE_H 2 | #define BOOK_INTERFACE_H 3 | static zend_class_entry *book_interface_ce; 4 | PHP_DESIGN_STARTUP_FUNCTION(book_interface); 5 | #endif 6 | -------------------------------------------------------------------------------- /facade/bios_interface.h: -------------------------------------------------------------------------------- 1 | #ifndef BIOS_INTERFACE_H 2 | #define BIOS_INTERFACE_H 3 | static zend_class_entry *bios_interface_ce; 4 | PHP_DESIGN_STARTUP_FUNCTION(bios_interface); 5 | #endif 6 | -------------------------------------------------------------------------------- /adapter/ebook_interface.h: -------------------------------------------------------------------------------- 1 | #ifndef EBOOK_INTERFACE_H 2 | #define EBOOK_INTERFACE_H 3 | static zend_class_entry *ebook_interface_ce; 4 | PHP_DESIGN_STARTUP_FUNCTION(ebook_interface); 5 | #endif 6 | -------------------------------------------------------------------------------- /abstractFactory/abstract_factory.h: -------------------------------------------------------------------------------- 1 | #ifndef ABSTRACT_FACTORY_H 2 | #define ABSTRACT_FACTORY_H 3 | static zend_class_entry *abstract_factory_ce; 4 | PHP_DESIGN_STARTUP_FUNCTION(abstract_factory); 5 | #endif 6 | -------------------------------------------------------------------------------- /commander/command_interface.h: -------------------------------------------------------------------------------- 1 | #ifndef COMMAND_INTERFACE_H 2 | #define COMMAND_INTERFACE_H 3 | static zend_class_entry * command_interface_ce; 4 | PHP_DESIGN_STARTUP_FUNCTION(command_interface); 5 | #endif 6 | -------------------------------------------------------------------------------- /bridge/formatter_interface.h: -------------------------------------------------------------------------------- 1 | #ifndef FORMATTER_INTERFACE_H 2 | #define FORMATTER_INTERFACE_H 3 | static zend_class_entry *formatter_interface_ce; 4 | PHP_DESIGN_STARTUP_FUNCTION(formatter_interface); 5 | #endif 6 | -------------------------------------------------------------------------------- /abstractFactory/mac_factory.h: -------------------------------------------------------------------------------- 1 | #ifndef MAC_FACTROY_H 2 | #define MAC_FACTROY_H 3 | PHP_METHOD(mac_factory, CreateButton); 4 | PHP_METHOD(mac_factory, CreateBorder); 5 | PHP_DESIGN_STARTUP_FUNCTION(mac_factory); 6 | #endif 7 | -------------------------------------------------------------------------------- /commander/invoker.h: -------------------------------------------------------------------------------- 1 | #ifndef INVOKER_H 2 | #define INVOKER_H 3 | static zend_class_entry * invoker_ce; 4 | PHP_METHOD(invoker, setCommand); 5 | PHP_METHOD(invoker, run); 6 | PHP_DESIGN_STARTUP_FUNCTION(invoker); 7 | #endif 8 | -------------------------------------------------------------------------------- /facade/linux_os.h: -------------------------------------------------------------------------------- 1 | #ifndef LINUX_OS_H 2 | #define LINUX_OS_H 3 | static zend_class_entry *linux_os_ce; 4 | PHP_METHOD(linux_os, halt); 5 | PHP_METHOD(linux_os, getName); 6 | PHP_DESIGN_STARTUP_FUNCTION(linux_os); 7 | #endif 8 | -------------------------------------------------------------------------------- /abstractFactory/win_factory.h: -------------------------------------------------------------------------------- 1 | #ifndef WIN_FACTROY_H 2 | #define WIN_FACTROY_H 3 | PHP_METHOD(win_factory, CreateButton); 4 | PHP_METHOD(win_factory, CreateBorder); 5 | PHP_DESIGN_STARTUP_FUNCTION(win_factory); 6 | #endif 7 | 8 | -------------------------------------------------------------------------------- /bridge/html_formatter.h: -------------------------------------------------------------------------------- 1 | #ifndef HTML_FORMATTER_H 2 | #define HTML_FORMATTER_H 3 | static zend_class_entry *html_formatter_ce; 4 | PHP_METHOD(html_formatter, format); 5 | PHP_DESIGN_STARTUP_FUNCTION(html_formatter); 6 | #endif 7 | -------------------------------------------------------------------------------- /bridge/service.h: -------------------------------------------------------------------------------- 1 | #ifndef SERVICE_H 2 | #define SERVICE_H 3 | static zend_class_entry *service_ce; 4 | PHP_METHOD(service, __construct); 5 | PHP_METHOD(service, setImplementation); 6 | PHP_DESIGN_STARTUP_FUNCTION(service); 7 | #endif 8 | -------------------------------------------------------------------------------- /commander/undoable_command_interface.h: -------------------------------------------------------------------------------- 1 | #ifndef UNDOABLE_COMMAND_INTERFACE_H 2 | #define UNDOABLE_COMMAND_INTERFACE_H 3 | static zend_class_entry * ud_command_interface_ce; 4 | PHP_DESIGN_STARTUP_FUNCTION(ud_command_interface); 5 | #endif 6 | -------------------------------------------------------------------------------- /facade/bios.h: -------------------------------------------------------------------------------- 1 | #ifndef BIOS_H 2 | #define BIOS_H 3 | static zend_class_entry *bios_ce; 4 | PHP_METHOD(bios, launch); 5 | PHP_METHOD(bios, execute); 6 | PHP_METHOD(bios, waitForKeyPress); 7 | PHP_DESIGN_STARTUP_FUNCTION(bios); 8 | #endif 9 | -------------------------------------------------------------------------------- /adapter/kindle.h: -------------------------------------------------------------------------------- 1 | #ifndef KINDLE_H 2 | #define KINDLE_H 3 | static zend_class_entry *kindle_ce; 4 | PHP_METHOD(kindle, pressNext); 5 | PHP_METHOD(kindle, unlock); 6 | PHP_METHOD(kindle, getPage); 7 | PHP_DESIGN_STARTUP_FUNCTION(kindle); 8 | #endif 9 | -------------------------------------------------------------------------------- /facade/facade.h: -------------------------------------------------------------------------------- 1 | #ifndef FACADE_H 2 | #define FACADE_H 3 | static zend_class_entry *facade_ce; 4 | PHP_METHOD(facade, __construct); 5 | PHP_METHOD(facade, turnOn); 6 | PHP_METHOD(facade, turnOff); 7 | PHP_DESIGN_STARTUP_FUNCTION(facade); 8 | #endif 9 | -------------------------------------------------------------------------------- /bridge/hello_world_service.h: -------------------------------------------------------------------------------- 1 | #ifndef HELLO_WORLD_SERVICE_H 2 | #define HELLO_WORLD_SERVICE_H 3 | static zend_class_entry *hello_world_service_ce; 4 | PHP_METHOD(hello_world_service, get); 5 | PHP_DESIGN_STARTUP_FUNCTION(hello_world_service); 6 | #endif 7 | 8 | -------------------------------------------------------------------------------- /bridge/plain_text_formatter.h: -------------------------------------------------------------------------------- 1 | #ifndef PLAIN_TEXT_FORMATTER_H 2 | #define PLAIN_TEXT_FORMATTER_H 3 | static zend_class_entry *plain_text_formatter_ce; 4 | PHP_METHOD(plain_text_formatter, format); 5 | PHP_DESIGN_STARTUP_FUNCTION(plain_text_formatter); 6 | #endif 7 | 8 | -------------------------------------------------------------------------------- /commander/hello_command.h: -------------------------------------------------------------------------------- 1 | #ifndef HELLO_COMMAND_H 2 | #define HELLO_COMMAND_H 3 | static zend_class_entry * hello_command_ce; 4 | PHP_METHOD(hello_command, __construct); 5 | PHP_METHOD(hello_command, execute); 6 | PHP_DESIGN_STARTUP_FUNCTION(hello_command); 7 | #endif 8 | -------------------------------------------------------------------------------- /adapter/ebook_adapter.h: -------------------------------------------------------------------------------- 1 | #ifndef EBOOK_ADAPTER_H 2 | #define EBOOK_ADAPTER_H 3 | PHP_METHOD(ebook_adapter, construct); 4 | PHP_METHOD(ebook_adapter, open); 5 | PHP_METHOD(ebook_adapter, turnPage); 6 | PHP_METHOD(ebook_adapter, getPage); 7 | PHP_DESIGN_STARTUP_FUNCTION(ebook_adapter); 8 | #endif 9 | -------------------------------------------------------------------------------- /commander/receiver.h: -------------------------------------------------------------------------------- 1 | #ifndef RECEVIER_H 2 | #define RECEVIER_H 3 | static zend_class_entry * receiver_ce; 4 | PHP_METHOD(receiver, write); 5 | PHP_METHOD(receiver, getOutput); 6 | PHP_METHOD(receiver, enableDate); 7 | PHP_METHOD(receiver, disableDate); 8 | PHP_DESIGN_STARTUP_FUNCTION(receiver); 9 | #endif 10 | -------------------------------------------------------------------------------- /dependencyInjection/database_connection.h: -------------------------------------------------------------------------------- 1 | #ifndef DATABASE_CONNECTION_H 2 | #define DATABASE_CONNECTION_H 3 | static zend_class_entry * database_connection_ce; 4 | PHP_METHOD(database_connection, __construct); 5 | PHP_METHOD(database_connection, getDsn); 6 | PHP_DESIGN_STARTUP_FUNCTION(database_connection); 7 | #endif 8 | -------------------------------------------------------------------------------- /commander/add_message_date_command.h: -------------------------------------------------------------------------------- 1 | #ifndef ADD_MESSAGE_DATE_COMMAND_H 2 | #define ADD_MESSAGE_DATE_COMMAND_H 3 | static zend_class_entry * add_msg_date_cmd_ce; 4 | PHP_METHOD(add_msg_date_cmd, __construct); 5 | PHP_METHOD(add_msg_date_cmd, execute); 6 | PHP_METHOD(add_msg_date_cmd, undo); 7 | PHP_DESIGN_STARTUP_FUNCTION(add_msg_date_cmd); 8 | #endif 9 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: php 2 | 3 | php: 4 | - 7.0 5 | 6 | notifications: 7 | email: 8 | recipients: 9 | - shinemotec@gmail.com 10 | on_success: always 11 | on_failure: always 12 | 13 | env: 14 | - REPORT_EXIT_STATUS=1 NO_INTERACTION=1 15 | 16 | #Compile 17 | before_script: 18 | - ./travis/compile.sh 19 | 20 | # Run PHPs run-tests.php 21 | script: 22 | - ./travis/run-test.sh 23 | -------------------------------------------------------------------------------- /tests/001.phpt: -------------------------------------------------------------------------------- 1 | --TEST-- 2 | Check for php_design_patterns presence 3 | --SKIPIF-- 4 | 5 | --FILE-- 6 | CreateButton(); 11 | $winObj = new WinFactory(); 12 | $winObj->CreateButton(); 13 | ?> 14 | --EXPECT-- 15 | MacFactory: CreateButton 16 | WINFactory: CreateButton 17 | -------------------------------------------------------------------------------- /travis/run-test.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | TEST_DIR="`pwd`/tests/" 3 | 4 | make test 5 | 6 | for file in `find $TEST_DIR -name "*.diff" 2>/dev/null` 7 | do 8 | grep "\-\-XFAIL--" ${file/%diff/phpt} >/dev/null 2>&1 9 | if [ $? -gt 0 ] 10 | then 11 | FAILS[${#FAILS[@]}]="$file" 12 | fi 13 | done 14 | 15 | if [ ${#FAILS[@]} -gt 0 ] 16 | then 17 | for fail in "${FAILS[@]}" 18 | do 19 | sh -xc "cat $fail" 20 | done 21 | exit 1 22 | else 23 | exit 0 24 | fi 25 | -------------------------------------------------------------------------------- /dependencyInjection/database_configuration.h: -------------------------------------------------------------------------------- 1 | #ifndef DATABASE_CONFIGURATION_H 2 | #define DATABASE_CONFIGURATION_H 3 | static zend_class_entry * database_configuration_ce; 4 | PHP_METHOD(database_configuration, __construct); 5 | PHP_METHOD(database_configuration, getHost); 6 | PHP_METHOD(database_configuration, getPort); 7 | PHP_METHOD(database_configuration, getUsername); 8 | PHP_METHOD(database_configuration, getPassword); 9 | PHP_DESIGN_STARTUP_FUNCTION(database_configuration); 10 | #endif 11 | -------------------------------------------------------------------------------- /config.w32: -------------------------------------------------------------------------------- 1 | // $Id$ 2 | // vim:ft=javascript 3 | 4 | // If your extension references something external, use ARG_WITH 5 | // ARG_WITH("php_design_patterns", "for php_design_patterns support", "no"); 6 | 7 | // Otherwise, use ARG_ENABLE 8 | // ARG_ENABLE("php_design_patterns", "enable php_design_patterns support", "no"); 9 | 10 | if (PHP_PHP_DESIGN_PATTERNS != "no") { 11 | EXTENSION("php_design_patterns", "php_design_patterns.c", PHP_EXTNAME_SHARED, "/DZEND_ENABLE_STATIC_TSRMLS_CACHE=1"); 12 | } 13 | 14 | -------------------------------------------------------------------------------- /tests/005.phpt: -------------------------------------------------------------------------------- 1 | --TEST-- 2 | Check for php_design_patterns presence 3 | --SKIPIF-- 4 | 5 | --FILE-- 6 | getDsn(); 12 | ?> 13 | --EXPECT-- 14 | root:1234@:127.9.0.1:3306 15 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .deps 2 | *.lo 3 | *.la 4 | .libs 5 | acinclude.m4 6 | aclocal.m4 7 | autom4te.cache 8 | build 9 | config.guess 10 | config.h 11 | config.h.in 12 | config.log 13 | config.nice 14 | config.status 15 | config.sub 16 | configure 17 | configure.ac 18 | include 19 | install-sh 20 | libtool 21 | ltmain.sh 22 | Makefile 23 | Makefile.fragments 24 | Makefile.global 25 | Makefile.objects 26 | missing 27 | mkinstalldirs 28 | modules 29 | run-tests.php 30 | tests/*/*.diff 31 | tests/*/*.out 32 | tests/*/*.php 33 | tests/*/*.exp 34 | tests/*/*.log 35 | tests/*/*.sh 36 | -------------------------------------------------------------------------------- /tests/003.phpt: -------------------------------------------------------------------------------- 1 | --TEST-- 2 | Check for php_design_patterns presence 3 | --SKIPIF-- 4 | 5 | --FILE-- 6 | get(); 13 | $service = new HelloWorldService(new PlainTextFormatter); 14 | $service->get(); 15 | ?> 16 | --EXPECT-- 17 |

Hello World

18 | Hello World 19 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # php-ext-design-patterns [![Build Status](https://travis-ci.org/motecshine/php-ext-design-patterns.svg?branch=master)](https://travis-ci.org/motecshine/php-ext-design-patterns) 2 | 3 | 4 | ## Install 5 | 6 | ``` 7 | phpize && ./configure && make && make test && make install 8 | ``` 9 | ## Required 10 | * PHP > 7.x 11 | * GCC > 4.8 12 | 13 | ## Finshed (已完成) 14 | Abstract Factory (抽象工厂模式) 15 | 16 | Adatpter (适配器模式) 17 | 18 | Bridge (桥接模式) 19 | 20 | Facade (Facade模式) 21 | 22 | DependencyInjection (DI) 23 | 24 | Commander (Commander) 25 | 26 | ## TODO 27 | 28 | * [x] Support Clang 29 | 30 | * [] Support Windows 31 | 32 | -------------------------------------------------------------------------------- /tests/004.phpt: -------------------------------------------------------------------------------- 1 | --TEST-- 2 | Check for php_design_patterns presence 3 | --SKIPIF-- 4 | 5 | --FILE-- 6 | turnOn(); 15 | echo $facade->os->getName() . "\n"; 16 | $facade->turnOff(); 17 | ?> 18 | --EXPECT-- 19 | bios execute 20 | waitForkeyPress 21 | bios launch 22 | Linux 23 | powerDown 24 | linux system halting.... 25 | -------------------------------------------------------------------------------- /facade/os_interface.c: -------------------------------------------------------------------------------- 1 | #ifdef HAVE_CONFIG_H 2 | #include "config.h" 3 | #endif 4 | 5 | #include "php.h" 6 | 7 | /* include global headers*/ 8 | #include "php_design_patterns.h" 9 | #include "facade/os_interface.h" 10 | 11 | static zend_function_entry os_interface_methods[] = { 12 | PHP_ABSTRACT_ME(os_interface, halt, NULL) 13 | PHP_ABSTRACT_ME(os_interface, getName, NULL) 14 | PHP_FE_END 15 | }; 16 | 17 | PHP_DESIGN_STARTUP_FUNCTION(os_interface) 18 | { 19 | zend_class_entry os_interface_container_ce; 20 | INIT_CLASS_ENTRY(os_interface_container_ce TSRMLS_CC, "PHPDesign\\Facade\\OsInterface", os_interface_methods); 21 | zend_register_internal_interface(&os_interface_container_ce TSRMLS_CC); 22 | return SUCCESS; 23 | } 24 | -------------------------------------------------------------------------------- /commander/command_interface.c: -------------------------------------------------------------------------------- 1 | #ifdef HAVE_CONFIG_H 2 | #include "config.h" 3 | #endif 4 | 5 | #include "php.h" 6 | #include "php_ini.h" 7 | #include "ext/standard/info.h" 8 | /* include global headers*/ 9 | #include "php_design_patterns.h" 10 | #include "commander/command_interface.h" 11 | 12 | zend_function_entry command_interface_methods[] = { 13 | PHP_ABSTRACT_ME(command_interface, execute, NULL) 14 | PHP_FE_END 15 | }; 16 | 17 | PHP_DESIGN_STARTUP_FUNCTION(command_interface) 18 | { 19 | zend_class_entry command_interface_container_ce; 20 | INIT_CLASS_ENTRY(command_interface_container_ce, "PHPDesign\\Commander\\CommandInterface", command_interface_methods); 21 | zend_register_internal_interface(&command_interface_container_ce); 22 | return SUCCESS; 23 | } 24 | -------------------------------------------------------------------------------- /abstractFactory/abstract_factory.c: -------------------------------------------------------------------------------- 1 | #ifdef HAVE_CONFIG_H 2 | #include "config.h" 3 | #endif 4 | 5 | #include "php.h" 6 | 7 | /* include global headers*/ 8 | #include "php_design_patterns.h" 9 | #include "abstractFactory/abstract_factory.h" 10 | 11 | static zend_function_entry abstract_factory_methods[] = { 12 | PHP_ABSTRACT_ME(abstract_factory, CreateButton, NULL) 13 | PHP_ABSTRACT_ME(abstract_factory, CreateBorder, NULL) 14 | PHP_FE_END 15 | }; 16 | 17 | PHP_DESIGN_STARTUP_FUNCTION(abstract_factory) 18 | { 19 | zend_class_entry abstract_factory_container_ce; 20 | INIT_CLASS_ENTRY(abstract_factory_container_ce, "PHPDesign\\AbstractFactory", abstract_factory_methods); 21 | zend_register_internal_interface(&abstract_factory_container_ce); 22 | return SUCCESS; 23 | } 24 | 25 | -------------------------------------------------------------------------------- /adapter/book_interface.c: -------------------------------------------------------------------------------- 1 | #ifdef HAVE_CONFIG_H 2 | #include "config.h" 3 | #endif 4 | 5 | #include "php.h" 6 | 7 | /* include global headers*/ 8 | #include "php_design_patterns.h" 9 | #include "adapter/book_interface.h" 10 | 11 | static zend_function_entry book_interface_methods[] = { 12 | PHP_ABSTRACT_ME(book_interface, turnPage, NULL) 13 | PHP_ABSTRACT_ME(book_interface, open, NULL) 14 | PHP_ABSTRACT_ME(book_interface, getPage, NULL) 15 | PHP_FE_END 16 | }; 17 | 18 | PHP_DESIGN_STARTUP_FUNCTION(book_interface) 19 | { 20 | zend_class_entry book_interface_container_ce; 21 | INIT_CLASS_ENTRY(book_interface_container_ce, "PHPDesign\\BookInterface", book_interface_methods); 22 | zend_register_internal_interface(&book_interface_container_ce); 23 | return SUCCESS; 24 | } 25 | -------------------------------------------------------------------------------- /adapter/ebook_interface.c: -------------------------------------------------------------------------------- 1 | #ifdef HAVE_CONFIG_H 2 | #include "config.h" 3 | #endif 4 | 5 | #include "php.h" 6 | 7 | /* include global headers*/ 8 | #include "php_design_patterns.h" 9 | #include "adapter/ebook_interface.h" 10 | 11 | static zend_function_entry ebook_interface_methods[] = { 12 | PHP_ABSTRACT_ME(ebook_interface, unlock, NULL) 13 | PHP_ABSTRACT_ME(ebook_interface, pressNext, NULL) 14 | PHP_ABSTRACT_ME(ebook_interface, getPage, NULL) 15 | PHP_FE_END 16 | }; 17 | 18 | PHP_DESIGN_STARTUP_FUNCTION(ebook_interface) 19 | { 20 | zend_class_entry ebook_interface_container_ce; 21 | INIT_CLASS_ENTRY(ebook_interface_container_ce, "PHPDesign\\EBookInterface", ebook_interface_methods); 22 | zend_register_internal_interface(&ebook_interface_container_ce); 23 | return SUCCESS; 24 | } 25 | -------------------------------------------------------------------------------- /commander/undoable_command_interface.c: -------------------------------------------------------------------------------- 1 | #ifdef HAVE_CONFIG_H 2 | #include "config.h" 3 | #endif 4 | 5 | #include "php.h" 6 | #include "php_ini.h" 7 | #include "ext/standard/info.h" 8 | /* include global headers*/ 9 | #include "php_design_patterns.h" 10 | #include "commander/undoable_command_interface.h" 11 | 12 | zend_function_entry ud_command_interface_methods[] = { 13 | PHP_ABSTRACT_ME(ud_command_interface, undo, NULL) 14 | PHP_FE_END 15 | }; 16 | 17 | PHP_DESIGN_STARTUP_FUNCTION(ud_command_interface) 18 | { 19 | zend_class_entry ud_command_interface_container_ce; 20 | INIT_CLASS_ENTRY(ud_command_interface_container_ce, "PHPDesign\\Commander\\UndoableCommandInterface", ud_command_interface_methods); 21 | ud_command_interface_ce = zend_register_internal_interface(&ud_command_interface_container_ce); 22 | return SUCCESS; 23 | } 24 | -------------------------------------------------------------------------------- /bridge/formatter_interface.c: -------------------------------------------------------------------------------- 1 | #ifdef HAVE_CONFIG_H 2 | #include "config.h" 3 | #endif 4 | 5 | #include "php.h" 6 | 7 | /* include global headers*/ 8 | #include "php_design_patterns.h" 9 | #include "bridge/formatter_interface.h" 10 | 11 | ZEND_BEGIN_ARG_INFO(formatter_interface_arg_info, 0) 12 | ZEND_ARG_INFO(0, text) 13 | ZEND_END_ARG_INFO() 14 | 15 | static zend_function_entry formatter_interface_methods[] = { 16 | PHP_ABSTRACT_ME(formatter_interface, format, formatter_interface_arg_info) 17 | PHP_FE_END 18 | }; 19 | 20 | PHP_DESIGN_STARTUP_FUNCTION(formatter_interface) 21 | { 22 | zend_class_entry formatter_interface_container_ce; 23 | INIT_CLASS_ENTRY(formatter_interface_container_ce, "PHPDesign\\FormatterInterface", formatter_interface_methods); 24 | zend_register_internal_interface(&formatter_interface_container_ce); 25 | return SUCCESS; 26 | } 27 | -------------------------------------------------------------------------------- /tests/002.phpt: -------------------------------------------------------------------------------- 1 | --TEST-- 2 | Check for php_design_patterns presence 3 | --SKIPIF-- 4 | 5 | --FILE-- 6 | open(); 12 | $bookObj->turnPage(); 13 | var_dump($bookObj->getPage()); 14 | 15 | $kindle = new Kindle(); 16 | $kindle->unlock(); 17 | $kindle->pressNext(); 18 | var_dump($kindle->getPage()); 19 | 20 | $ebookAdapter = new EbookAdapter(new Kindle()); 21 | 22 | $ebookAdapter->open(); 23 | $ebookAdapter->turnPage(); 24 | var_dump($ebookAdapter->getPage()); 25 | ?> 26 | --EXPECT-- 27 | int(2) 28 | array(2) { 29 | [0]=> 30 | int(1) 31 | [1]=> 32 | int(100) 33 | } 34 | array(2) { 35 | [0]=> 36 | int(1) 37 | [1]=> 38 | int(100) 39 | } 40 | 41 | -------------------------------------------------------------------------------- /facade/bios_interface.c: -------------------------------------------------------------------------------- 1 | #ifdef HAVE_CONFIG_H 2 | #include "config.h" 3 | #endif 4 | 5 | #include "php.h" 6 | 7 | ZEND_BEGIN_ARG_INFO(bios_interface_arg_info, 0) 8 | ZEND_ARG_INFO(0, os) 9 | ZEND_END_ARG_INFO() 10 | 11 | /* include global headers*/ 12 | #include "php_design_patterns.h" 13 | #include "facade/bios_interface.h" 14 | 15 | static zend_function_entry bios_interface_methods[] = { 16 | PHP_ABSTRACT_ME(bios_interface, execute, NULL) 17 | PHP_ABSTRACT_ME(bios_interface, waitForkeyPress, NULL) 18 | PHP_ABSTRACT_ME(bios_interface, launch, bios_interface_arg_info) 19 | PHP_ABSTRACT_ME(bios_interface, powerDown, NULL) 20 | PHP_FE_END 21 | }; 22 | 23 | PHP_DESIGN_STARTUP_FUNCTION(bios_interface) 24 | { 25 | zend_class_entry bios_interface_container_ce; 26 | INIT_CLASS_ENTRY(bios_interface_container_ce TSRMLS_CC, "PHPDesign\\Facade\\BiosInterface", bios_interface_methods); 27 | zend_register_internal_interface(&bios_interface_container_ce TSRMLS_CC); 28 | return SUCCESS; 29 | } 30 | -------------------------------------------------------------------------------- /tests/006.phpt: -------------------------------------------------------------------------------- 1 | --TEST-- 2 | Check for php_design_patterns presence 3 | --SKIPIF-- 4 | 5 | --FILE-- 6 | setCommand(new HelloCommand($receiver)); 14 | $invoker->run(); 15 | var_dump($receiver->getOutput()); 16 | 17 | $messageDateCommand = new AddMessageDateCommand($receiver); 18 | $messageDateCommand->execute(); 19 | $invoker->run(); 20 | var_dump($receiver->getOutput()); 21 | 22 | $messageDateCommand->undo(); 23 | $invoker->run(); 24 | var_dump($receiver->getOutput()); 25 | ?> 26 | --EXPECT-- 27 | array(1) { 28 | [0]=> 29 | string(12) "Hello World " 30 | } 31 | array(1) { 32 | [0]=> 33 | string(23) "Hello World 1993-04-01" 34 | } 35 | array(1) { 36 | [0]=> 37 | string(23) "Hello World 1993-04-01" 38 | } 39 | -------------------------------------------------------------------------------- /abstractFactory/mac_factory.c: -------------------------------------------------------------------------------- 1 | #ifdef HAVE_CONFIG_H 2 | #include "config.h" 3 | #endif 4 | 5 | #include "php.h" 6 | 7 | /* include global headers*/ 8 | #include "php_design_patterns.h" 9 | #include "abstractFactory/abstract_factory.h" 10 | #include "abstractFactory/mac_factory.h" 11 | static zend_class_entry *mac_factory_ce; 12 | 13 | PHP_METHOD(mac_factory, CreateButton) 14 | { 15 | php_printf("MacFactory: CreateButton\n"); 16 | } 17 | 18 | PHP_METHOD(mac_factory, CreateBorder) 19 | { 20 | php_printf("MacFactory: CreateBorder\n"); 21 | } 22 | 23 | static zend_function_entry mac_factory_methods[] = { 24 | PHP_ME(mac_factory, CreateBorder, NULL, ZEND_ACC_PUBLIC) 25 | PHP_ME(mac_factory, CreateButton, NULL, ZEND_ACC_PUBLIC) 26 | PHP_FE_END 27 | }; 28 | 29 | PHP_DESIGN_STARTUP_FUNCTION(mac_factory) 30 | { 31 | zend_string *abstract_factory_interface_name, *abstract_factory_interface_name_tolower; 32 | zend_class_entry mac_factory_container_ce; 33 | abstract_factory_interface_name = strpprintf(0, "PHPDesign\\AbstractFactory"); 34 | abstract_factory_interface_name_tolower = zend_string_tolower(abstract_factory_interface_name); 35 | INIT_CLASS_ENTRY(mac_factory_container_ce, "PHPDesign\\MacFactory", mac_factory_methods); 36 | mac_factory_ce = zend_register_internal_class(&mac_factory_container_ce TSRMLS_CC); 37 | if ((abstract_factory_ce = zend_hash_find_ptr(CG(class_table), abstract_factory_interface_name_tolower)) != NULL) { 38 | zend_class_implements(mac_factory_ce TSRMLS_CC, 1, abstract_factory_ce); 39 | } 40 | zend_string_release(abstract_factory_interface_name); 41 | zend_string_release(abstract_factory_interface_name_tolower); 42 | return SUCCESS; 43 | } 44 | -------------------------------------------------------------------------------- /abstractFactory/win_factory.c: -------------------------------------------------------------------------------- 1 | #ifdef HAVE_CONFIG_H 2 | #include "config.h" 3 | #endif 4 | 5 | #include "php.h" 6 | 7 | /* include global headers*/ 8 | #include "php_design_patterns.h" 9 | #include "abstractFactory/abstract_factory.h" 10 | #include "abstractFactory/win_factory.h" 11 | 12 | static zend_class_entry *win_factory_ce; 13 | 14 | PHP_METHOD(win_factory, CreateButton) 15 | { 16 | php_printf("WINFactory: CreateButton\n"); 17 | } 18 | 19 | PHP_METHOD(win_factory, CreateBorder) 20 | { 21 | php_printf("WINFactory: CreateBorder\n"); 22 | } 23 | 24 | static zend_function_entry win_factory_methods[] = { 25 | PHP_ME(win_factory, CreateBorder, NULL, ZEND_ACC_PUBLIC) 26 | PHP_ME(win_factory, CreateButton, NULL, ZEND_ACC_PUBLIC) 27 | PHP_FE_END 28 | }; 29 | 30 | PHP_DESIGN_STARTUP_FUNCTION(win_factory) 31 | { 32 | zend_string *abstract_factory_interface_name, *abstract_factory_interface_name_tolower; 33 | zend_class_entry win_factory_container_ce; 34 | abstract_factory_interface_name = strpprintf(0, "PHPDesign\\AbstractFactory"); 35 | abstract_factory_interface_name_tolower = zend_string_tolower(abstract_factory_interface_name); 36 | INIT_CLASS_ENTRY(win_factory_container_ce, "PHPDesign\\WinFactory", win_factory_methods); 37 | win_factory_ce = zend_register_internal_class(&win_factory_container_ce TSRMLS_CC); 38 | if ((abstract_factory_ce = zend_hash_find_ptr(CG(class_table), abstract_factory_interface_name_tolower)) != NULL) { 39 | zend_class_implements(win_factory_ce TSRMLS_CC, 1, abstract_factory_ce); 40 | } 41 | zend_string_release(abstract_factory_interface_name); 42 | zend_string_release(abstract_factory_interface_name_tolower); 43 | return SUCCESS; 44 | } 45 | -------------------------------------------------------------------------------- /facade/linux_os.c: -------------------------------------------------------------------------------- 1 | #ifdef HAVE_CONFIG_H 2 | #include "config.h" 3 | #endif 4 | 5 | #include "php.h" 6 | 7 | /* include global headers*/ 8 | #include "php_design_patterns.h" 9 | #include "facade/linux_os.h" 10 | #include "facade/os_interface.h" 11 | 12 | PHP_METHOD(linux_os, halt) 13 | { 14 | php_printf("linux system halting...."); 15 | } 16 | 17 | PHP_METHOD(linux_os, getName) 18 | { 19 | zend_string *linux_name; 20 | linux_name = strpprintf(0, "Linux"); 21 | RETURN_STR(linux_name); 22 | } 23 | 24 | static zend_function_entry linux_os_methods[] = { 25 | PHP_ME(linux_os, halt, NULL, ZEND_ACC_PUBLIC) 26 | PHP_ME(linux_os, getName, NULL, ZEND_ACC_PUBLIC) 27 | PHP_FE_END 28 | }; 29 | 30 | PHP_DESIGN_STARTUP_FUNCTION(linux_os) 31 | { 32 | zend_class_entry linux_os_container_ce; 33 | zend_string *os_interface_name, *os_interface_name_tolower; 34 | 35 | os_interface_name = strpprintf(0, "PHPDesign\\Facade\\OsInterface"); 36 | os_interface_name_tolower = zend_string_tolower(os_interface_name); 37 | 38 | if ((os_interface_ce = zend_hash_find_ptr(CG(class_table), os_interface_name_tolower)) == NULL) { 39 | php_error_docref(NULL TSRMLS_CC, E_ERROR, "Can not implement PHPDesign\\Facade\\OsInterface"); 40 | return FAILURE; 41 | } 42 | 43 | /* initial class */ 44 | INIT_CLASS_ENTRY(linux_os_container_ce, "PHPDesign\\Facade\\Linux", linux_os_methods); 45 | linux_os_ce = zend_register_internal_class(&linux_os_container_ce TSRMLS_CC); 46 | 47 | /* implement os_interface */ 48 | zend_class_implements(linux_os_ce, 1, os_interface_ce); 49 | zend_string_release(os_interface_name); 50 | zend_string_release(os_interface_name_tolower); 51 | return SUCCESS; 52 | } 53 | -------------------------------------------------------------------------------- /bridge/service.c: -------------------------------------------------------------------------------- 1 | #ifdef HAVE_CONFIG_H 2 | #include "config.h" 3 | #endif 4 | 5 | #include "php.h" 6 | #include "php_ini.h" 7 | #include "ext/standard/info.h" 8 | /* include global headers*/ 9 | #include "php_design_patterns.h" 10 | #include "bridge/service.h" 11 | 12 | ZEND_BEGIN_ARG_INFO(service_arg_info, 0) 13 | ZEND_ARG_INFO(0, printer) 14 | ZEND_END_ARG_INFO() 15 | 16 | PHP_METHOD(service, __construct) 17 | { 18 | zval *printer; 19 | 20 | ZEND_PARSE_PARAMETERS_START(1, 1) 21 | Z_PARAM_ZVAL(printer) 22 | ZEND_PARSE_PARAMETERS_END(); 23 | 24 | service_ce = Z_OBJCE_P(getThis()); 25 | zend_update_property(service_ce, getThis(), ZEND_STRL("implementation"), printer); 26 | } 27 | 28 | PHP_METHOD(service, setImplementation) 29 | { 30 | zval *printer; 31 | 32 | ZEND_PARSE_PARAMETERS_START(1, 1) 33 | Z_PARAM_ZVAL(printer) 34 | ZEND_PARSE_PARAMETERS_END(); 35 | 36 | service_ce = Z_OBJCE_P(getThis()); 37 | zend_update_property(service_ce, getThis(), ZEND_STRL("implementation"), printer); 38 | } 39 | 40 | PHP_METHOD(service, get) 41 | { 42 | 43 | } 44 | 45 | zend_function_entry service_methods[] = { 46 | PHP_ME(service, __construct, service_arg_info, ZEND_ACC_PUBLIC | ZEND_ACC_CTOR) 47 | PHP_ME(service, setImplementation, service_arg_info, ZEND_ACC_PUBLIC) 48 | PHP_ME(service, get, NULL, ZEND_ACC_ABSTRACT | ZEND_ACC_PUBLIC) 49 | PHP_FE_END 50 | }; 51 | 52 | PHP_DESIGN_STARTUP_FUNCTION(service) 53 | { 54 | zend_class_entry service_container_ce; 55 | INIT_CLASS_ENTRY(service_container_ce, "PHPDesign\\Service", service_methods); 56 | service_ce = zend_register_internal_class(&service_container_ce TSRMLS_CC); 57 | service_ce->ce_flags |= ZEND_ACC_EXPLICIT_ABSTRACT_CLASS; 58 | /* Declare $implementation*/ 59 | zend_declare_property_null(service_ce, ZEND_STRL("implementation"), ZEND_ACC_PUBLIC); 60 | return SUCCESS; 61 | } 62 | -------------------------------------------------------------------------------- /bridge/html_formatter.c: -------------------------------------------------------------------------------- 1 | #ifdef HAVE_CONFIG_H 2 | #include "config.h" 3 | #endif 4 | 5 | #include "php.h" 6 | #include "php_ini.h" 7 | #include "ext/standard/info.h" 8 | /* include global headers*/ 9 | #include "php_design_patterns.h" 10 | #include "bridge/formatter_interface.h" 11 | #include "bridge/html_formatter.h" 12 | 13 | ZEND_BEGIN_ARG_INFO(html_formatter_arg_info, 0) 14 | ZEND_ARG_INFO(0, text) 15 | ZEND_END_ARG_INFO() 16 | 17 | PHP_METHOD(html_formatter, format) 18 | { 19 | zend_string *text; 20 | 21 | ZEND_PARSE_PARAMETERS_START(1, 1) 22 | Z_PARAM_STR(text) 23 | ZEND_PARSE_PARAMETERS_END(); 24 | 25 | php_printf("

%s

\n", ZSTR_VAL(text)); 26 | } 27 | 28 | static zend_function_entry html_formatter_methods[] = { 29 | PHP_ME(html_formatter, format, html_formatter_arg_info, ZEND_ACC_PUBLIC) 30 | PHP_FE_END 31 | }; 32 | 33 | PHP_DESIGN_STARTUP_FUNCTION(html_formatter) 34 | { 35 | zend_class_entry html_formatter_conatainer_ce; 36 | zend_string *formatter_interface_name, *formatter_interface_name_tolower; 37 | INIT_CLASS_ENTRY(html_formatter_conatainer_ce, "PHPDesign\\HtmlFormatter", html_formatter_methods); 38 | html_formatter_ce = zend_register_internal_class(&html_formatter_conatainer_ce TSRMLS_CC); 39 | formatter_interface_name = strpprintf(0, "PHPDesign\\FormatterInterface"); 40 | formatter_interface_name_tolower = zend_string_tolower(formatter_interface_name); 41 | if ((formatter_interface_ce = zend_hash_find_ptr(CG(class_table), formatter_interface_name_tolower)) == NULL) { 42 | php_error_docref(NULL TSRMLS_CC, E_ERROR, "Can not implement PHPDesign\\FormatterInterface"); 43 | return FAILURE; 44 | } 45 | zend_class_implements(html_formatter_ce TSRMLS_CC, 1, formatter_interface_ce); 46 | zend_string_release(formatter_interface_name); 47 | zend_string_release(formatter_interface_name_tolower); 48 | return SUCCESS; 49 | } 50 | -------------------------------------------------------------------------------- /commander/invoker.c: -------------------------------------------------------------------------------- 1 | #ifdef HAVE_CONFIG_H 2 | #include "config.h" 3 | #endif 4 | 5 | #include "php.h" 6 | #include "php_ini.h" 7 | #include "ext/standard/info.h" 8 | /* include global headers*/ 9 | #include "php_design_patterns.h" 10 | #include "commander/command_interface.h" 11 | #include "commander/invoker.h" 12 | 13 | ZEND_BEGIN_ARG_INFO(invoker_arg_info, 0) 14 | ZEND_ARG_INFO(0, command) 15 | ZEND_END_ARG_INFO() 16 | 17 | PHP_METHOD(invoker, setCommand) 18 | { 19 | zval * command; 20 | ZEND_PARSE_PARAMETERS_START(1, 1) 21 | Z_PARAM_ZVAL(command) 22 | ZEND_PARSE_PARAMETERS_END(); 23 | /* update cmd */ 24 | zend_update_property(Z_OBJCE_P(getThis()), getThis(), ZEND_STRL("command"), command); 25 | } 26 | 27 | PHP_METHOD(invoker, run) 28 | { 29 | zval * object; 30 | zval function_name; 31 | ZVAL_STRING(&function_name, "execute"); 32 | object = zend_read_property(Z_OBJCE_P(getThis()), getThis(), ZEND_STRL("command"), 0, 0 TSRMLS_CC); 33 | /* execute function */ 34 | if (call_user_function(CG(function_table), object, &function_name, return_value, ZEND_NUM_ARGS(), NULL TSRMLS_CC) == FAILURE) { 35 | php_error_docref(NULL TSRMLS_CC, E_ERROR, "can not execute execute() function"); 36 | return; 37 | } 38 | /* release zval */ 39 | zval_dtor(&function_name); 40 | zval_ptr_dtor(return_value); 41 | } 42 | 43 | zend_function_entry invoker_methods[] = { 44 | PHP_ME(invoker, setCommand, invoker_arg_info, ZEND_ACC_PUBLIC) 45 | PHP_ME(invoker, run, NULL, ZEND_ACC_PUBLIC) 46 | PHP_FE_END 47 | }; 48 | 49 | PHP_DESIGN_STARTUP_FUNCTION(invoker) 50 | { 51 | zend_class_entry invoker_container_ce; 52 | INIT_CLASS_ENTRY(invoker_container_ce, "PHPDesign\\Commander\\Invoker", invoker_methods); 53 | invoker_ce = zend_register_internal_class(&invoker_container_ce); 54 | zend_declare_property_null(invoker_ce, ZEND_STRL("command"), ZEND_ACC_PUBLIC); 55 | return SUCCESS; 56 | } 57 | -------------------------------------------------------------------------------- /bridge/plain_text_formatter.c: -------------------------------------------------------------------------------- 1 | #ifdef HAVE_CONFIG_H 2 | #include "config.h" 3 | #endif 4 | 5 | #include "php.h" 6 | #include "php_ini.h" 7 | #include "ext/standard/info.h" 8 | /* include global headers*/ 9 | #include "php_design_patterns.h" 10 | #include "bridge/formatter_interface.h" 11 | #include "bridge/plain_text_formatter.h" 12 | 13 | ZEND_BEGIN_ARG_INFO(plain_text_formatter_arg_info, 0) 14 | ZEND_ARG_INFO(0, text) 15 | ZEND_END_ARG_INFO() 16 | 17 | PHP_METHOD(plain_text_formatter, format) 18 | { 19 | zend_string *text; 20 | 21 | ZEND_PARSE_PARAMETERS_START(1, 1) 22 | Z_PARAM_STR(text) 23 | ZEND_PARSE_PARAMETERS_END(); 24 | 25 | php_printf("%s\n", ZSTR_VAL(text)); 26 | } 27 | 28 | static zend_function_entry plain_text_formatter_methods[] = { 29 | PHP_ME(plain_text_formatter, format, plain_text_formatter_arg_info, ZEND_ACC_PUBLIC) 30 | PHP_FE_END 31 | }; 32 | 33 | PHP_DESIGN_STARTUP_FUNCTION(plain_text_formatter) 34 | { 35 | zend_class_entry plain_text_formatter_conatainer_ce; 36 | zend_string *formatter_interface_name, *formatter_interface_name_tolower; 37 | INIT_CLASS_ENTRY(plain_text_formatter_conatainer_ce, "PHPDesign\\PlainTextFormatter", plain_text_formatter_methods); 38 | plain_text_formatter_ce = zend_register_internal_class(&plain_text_formatter_conatainer_ce TSRMLS_CC); 39 | formatter_interface_name = strpprintf(0, "PHPDesign\\FormatterInterface"); 40 | formatter_interface_name_tolower = zend_string_tolower(formatter_interface_name); 41 | if ((formatter_interface_ce = zend_hash_find_ptr(CG(class_table), formatter_interface_name_tolower)) == NULL) { 42 | php_error_docref(NULL TSRMLS_CC, E_ERROR, "Can not implement PHPDesign\\FormatterInterface"); 43 | return FAILURE; 44 | } 45 | zend_class_implements(plain_text_formatter_ce TSRMLS_CC, 1, formatter_interface_ce); 46 | zend_string_release(formatter_interface_name); 47 | zend_string_release(formatter_interface_name_tolower); 48 | return SUCCESS; 49 | } 50 | -------------------------------------------------------------------------------- /facade/bios.c: -------------------------------------------------------------------------------- 1 | #ifdef HAVE_CONFIG_H 2 | #include "config.h" 3 | #endif 4 | 5 | #include "php.h" 6 | 7 | /* include global headers*/ 8 | #include "php_design_patterns.h" 9 | #include "facade/bios.h" 10 | #include "facade/bios_interface.h" 11 | 12 | ZEND_BEGIN_ARG_INFO(bios_interface_arg_info, 0) 13 | ZEND_ARG_INFO(0, os) 14 | ZEND_END_ARG_INFO() 15 | 16 | PHP_METHOD(bios, execute) 17 | { 18 | php_printf("bios execute\n"); 19 | } 20 | 21 | PHP_METHOD(bios, launch) 22 | { 23 | php_printf("bios launch\n"); 24 | } 25 | 26 | PHP_METHOD(bios, waitForkeyPress) 27 | { 28 | php_printf("waitForkeyPress\n"); 29 | } 30 | 31 | PHP_METHOD(bios, powerDown) 32 | { 33 | php_printf("powerDown\n"); 34 | } 35 | 36 | static zend_function_entry bios_methods[] = { 37 | PHP_ME(bios, execute, NULL, ZEND_ACC_PUBLIC) 38 | PHP_ME(bios, launch, bios_interface_arg_info, ZEND_ACC_PUBLIC) 39 | PHP_ME(bios, waitForkeyPress, NULL, ZEND_ACC_PUBLIC) 40 | PHP_ME(bios, powerDown, NULL, ZEND_ACC_PUBLIC) 41 | PHP_FE_END 42 | }; 43 | 44 | PHP_DESIGN_STARTUP_FUNCTION(bios) 45 | { 46 | zend_class_entry bios_container_ce; 47 | zend_string *bios_interface_name, *bios_interface_name_tolower; 48 | 49 | bios_interface_name = strpprintf(0, "PHPDesign\\Facade\\BiosInterface"); 50 | bios_interface_name_tolower = zend_string_tolower(bios_interface_name); 51 | 52 | if ((bios_interface_ce = zend_hash_find_ptr(CG(class_table), bios_interface_name_tolower)) == NULL) { 53 | php_error_docref(NULL TSRMLS_CC, E_ERROR, "Can not implement PHPDesign\\Facade\\BiosInterface"); 54 | return FAILURE; 55 | } 56 | 57 | /* initial class */ 58 | INIT_CLASS_ENTRY(bios_container_ce, "PHPDesign\\Facade\\Bios", bios_methods); 59 | bios_ce = zend_register_internal_class(&bios_container_ce TSRMLS_CC); 60 | /* implement os_interface */ 61 | zend_class_implements(bios_ce, 1, bios_interface_ce); 62 | zend_string_release(bios_interface_name); 63 | zend_string_release(bios_interface_name_tolower); 64 | return SUCCESS; 65 | } 66 | -------------------------------------------------------------------------------- /bridge/hello_world_service.c: -------------------------------------------------------------------------------- 1 | #ifdef HAVE_CONFIG_H 2 | #include "config.h" 3 | #endif 4 | 5 | #include "php.h" 6 | #include "php_ini.h" 7 | #include "ext/standard/info.h" 8 | /* include global headers*/ 9 | #include "php_design_patterns.h" 10 | #include "bridge/service.h" 11 | #include "bridge/hello_world_service.h" 12 | 13 | PHP_METHOD(hello_world_service, get) 14 | { 15 | zval *object; 16 | zval function_name; 17 | zval hello_world_string; 18 | /* set function name*/ 19 | ZVAL_STRING(&function_name, "format"); 20 | /* set param string */ 21 | ZVAL_STRING(&hello_world_string, "Hello World"); 22 | 23 | /* read $this->implementation */ 24 | hello_world_service_ce = Z_OBJCE_P(getThis()); 25 | object = zend_read_property(hello_world_service_ce, getThis(), ZEND_STRL("implementation"), 0, 0 TSRMLS_CC); 26 | call_user_function(CG(function_table), object, &function_name ,return_value, 1, &hello_world_string TSRMLS_CC); 27 | zval_dtor(&function_name); 28 | zval_ptr_dtor(return_value); 29 | zval_dtor(&hello_world_string); 30 | } 31 | 32 | zend_function_entry hello_world_service_methods[] = { 33 | PHP_ME(hello_world_service, get, NULL, ZEND_ACC_PUBLIC) 34 | PHP_FE_END 35 | }; 36 | 37 | PHP_DESIGN_STARTUP_FUNCTION(hello_world_service) 38 | { 39 | zend_class_entry hello_world_service_container_ce; 40 | zend_string *service_name, *service_name_tolower; 41 | service_name = strpprintf(0, "PHPDesign\\Service"); 42 | service_name_tolower = zend_string_tolower(service_name); 43 | INIT_CLASS_ENTRY(hello_world_service_container_ce, "PHPDesign\\HelloWorldService", hello_world_service_methods); 44 | if ((service_ce = zend_hash_find_ptr(CG(class_table), service_name_tolower)) == NULL) { 45 | php_error_docref(NULL TSRMLS_CC, E_ERROR, "Can not extends PHPDesign\\Service class"); 46 | return FAILURE; 47 | } 48 | hello_world_service_ce = zend_register_internal_class_ex(&hello_world_service_container_ce, service_ce); 49 | zend_string_release(service_name); 50 | zend_string_release(service_name_tolower); 51 | return SUCCESS; 52 | } 53 | -------------------------------------------------------------------------------- /adapter/book.c: -------------------------------------------------------------------------------- 1 | #ifdef HAVE_CONFIG_H 2 | #include "config.h" 3 | #endif 4 | 5 | #include "php.h" 6 | 7 | /* include global headers*/ 8 | #include "php_design_patterns.h" 9 | #include "adapter/book_interface.h" 10 | #include "adapter/book.h" 11 | static zend_class_entry *book_ce; 12 | 13 | PHP_METHOD(book, open) 14 | { 15 | book_ce = Z_OBJCE_P(getThis()); 16 | zend_update_property_long(book_ce, getThis(), ZEND_STRL("pageNum"), (zend_long)1 TSRMLS_CC); 17 | } 18 | 19 | PHP_METHOD(book, turnPage) 20 | { 21 | zend_long pageNum; 22 | book_ce = Z_OBJCE_P(getThis()); 23 | pageNum = ++Z_LVAL_P(zend_read_property(book_ce, getThis(), ZEND_STRL("pageNum"), 0, 0 TSRMLS_CC)); 24 | zend_update_property_long(book_ce, getThis(), ZEND_STRL("pageNum"), (zend_long) pageNum TSRMLS_CC); 25 | } 26 | 27 | PHP_METHOD(book, getPage) 28 | { 29 | zend_long pageNum; 30 | pageNum = Z_LVAL_P(zend_read_property(book_ce, getThis(), ZEND_STRL("pageNum"), 0, 0 TSRMLS_CC)); 31 | RETURN_LONG(pageNum); 32 | } 33 | 34 | static zend_function_entry book_methods[] = { 35 | PHP_ME(book, open, NULL, ZEND_ACC_PUBLIC) 36 | PHP_ME(book, turnPage, NULL, ZEND_ACC_PUBLIC) 37 | PHP_ME(book, getPage, NULL, ZEND_ACC_PUBLIC) 38 | PHP_FE_END 39 | }; 40 | 41 | PHP_DESIGN_STARTUP_FUNCTION(book) 42 | { 43 | zend_string *book_interface_name, *book_interface_name_tolower; 44 | zend_class_entry book_container_ce; 45 | 46 | book_interface_name = strpprintf(0, "PHPDesign\\BookInterface"); 47 | book_interface_name_tolower = zend_string_tolower(book_interface_name); 48 | INIT_CLASS_ENTRY(book_container_ce, "PHPDesign\\Book", book_methods); 49 | book_ce = zend_register_internal_class(&book_container_ce TSRMLS_CC); 50 | 51 | if ((book_interface_ce = zend_hash_find_ptr(CG(class_table), book_interface_name_tolower)) == NULL) { 52 | php_error_docref(NULL TSRMLS_CC, E_ERROR, "Can not implement book interface"); 53 | return FAILURE; 54 | } 55 | 56 | /* declare book class member */ 57 | zend_declare_property_long(book_ce, ZEND_STRL("pageNum"), 0, ZEND_ACC_PRIVATE); 58 | zend_class_implements(book_ce, 1, book_interface_ce); 59 | zend_string_release(book_interface_name); 60 | zend_string_release(book_interface_name_tolower); 61 | return SUCCESS; 62 | } 63 | -------------------------------------------------------------------------------- /php_design_patterns.php: -------------------------------------------------------------------------------- 1 | "; 3 | 4 | if(!extension_loaded('php_design_patterns')) { 5 | dl('php_design_patterns.' . PHP_SHLIB_SUFFIX); 6 | } 7 | use PHPDesign\MacFactory; 8 | use PHPDesign\WinFactory; 9 | use PHPDesign\Book; 10 | use PHPDesign\Kindle; 11 | use PHPDesign\EbookAdapter; 12 | use PHPDesign\HelloWorldService; 13 | use PHPDesign\PlainTextFormatter; 14 | use PHPDesign\HtmlFormatter; 15 | use PHPDesign\Facade\Facade; 16 | use PHPDesign\Facade\Bios; 17 | use PHPDesign\Facade\Linux; 18 | use PHPDesign\DI\DatabaseConfiguration; 19 | use PHPDesign\DI\DatabaseConnection; 20 | use PHPDesign\Commander\HelloCommand; 21 | use PHPDesign\Commander\Invoker; 22 | use PHPDesign\Commander\Receiver; 23 | use PHPDesign\Commander\AddMessageDateCommand; 24 | $macObj = new MacFactory(); 25 | $macObj->CreateButton(); 26 | $winObj = new WinFactory(); 27 | $winObj->CreateButton(); 28 | 29 | $bookObj = new Book(); 30 | $bookObj->open(); 31 | $bookObj->turnPage(); 32 | var_dump($bookObj->getPage()); 33 | 34 | $kindle = new Kindle(); 35 | $kindle->unlock(); 36 | $kindle->pressNext(); 37 | var_dump($kindle->getPage()); 38 | 39 | $ebookAdapter = new EbookAdapter(new Kindle()); 40 | 41 | $ebookAdapter->open(); 42 | $ebookAdapter->turnPage(); 43 | var_dump($ebookAdapter->getPage()); 44 | 45 | /* Bridge Patterns*/ 46 | $service = new HelloWorldService(new HtmlFormatter); 47 | $service->get(); 48 | $service = new HelloWorldService(new PlainTextFormatter); 49 | $service->get(); 50 | 51 | /* Facade Patterns */ 52 | $bios = new Bios(); 53 | $linux = new Linux(); 54 | $facade = new Facade($linux, $bios); 55 | $facade->turnOn(); 56 | echo $facade->os->getName() . "\n"; 57 | $facade->turnOff(); 58 | echo "\n"; 59 | 60 | $configuration = new DatabaseConfiguration("127.9.0.1", "3306", "root", "1234"); 61 | $connection = new DatabaseConnection($configuration); 62 | $connection->getDsn(); 63 | 64 | 65 | $invoker = new Invoker(); 66 | $receiver = new Receiver(); 67 | $invoker->setCommand(new HelloCommand($receiver)); 68 | $invoker->run(); 69 | var_dump($receiver->getOutput()); 70 | 71 | $messageDateCommand = new AddMessageDateCommand($receiver); 72 | $messageDateCommand->execute(); 73 | $invoker->run(); 74 | var_dump($receiver->getOutput()); 75 | 76 | $messageDateCommand->undo(); 77 | $invoker->run(); 78 | var_dump($receiver->getOutput()); 79 | ?> 80 | -------------------------------------------------------------------------------- /adapter/kindle.c: -------------------------------------------------------------------------------- 1 | #ifdef HAVE_CONFIG_H 2 | #include "config.h" 3 | #endif 4 | 5 | #include "php.h" 6 | 7 | /* include global headers*/ 8 | #include "php_design_patterns.h" 9 | #include "adapter/ebook_interface.h" 10 | #include "adapter/kindle.h" 11 | 12 | static zend_class_entry *kindle_ce; 13 | 14 | PHP_METHOD(kindle, pressNext) 15 | { 16 | zend_long pageNum; 17 | kindle_ce = Z_OBJCE_P(getThis()); 18 | pageNum = ++Z_LVAL_P(zend_read_property(kindle_ce, getThis(), ZEND_STRL("pageNum"), 0, 0 TSRMLS_CC)); 19 | zend_update_property_long(kindle_ce, getThis(), ZEND_STRL("pageNum"), pageNum TSRMLS_CC); 20 | } 21 | 22 | PHP_METHOD(kindle, unlock) 23 | { 24 | 25 | } 26 | 27 | PHP_METHOD(kindle, getPage) 28 | { 29 | zend_long pageNum, pageNumTotal; 30 | zval retval; 31 | array_init(&retval); 32 | pageNum = Z_LVAL_P(zend_read_property(kindle_ce, getThis(), ZEND_STRL("pageNum"), 0, 0 TSRMLS_CC)); 33 | pageNumTotal = Z_LVAL_P(zend_read_property(kindle_ce, getThis(), ZEND_STRL("pageNumTotal"), 0, 0 TSRMLS_CC)); 34 | add_index_long(&retval, 0, pageNum); 35 | add_next_index_long(&retval, pageNumTotal); 36 | RETURN_ZVAL(&retval, 0, 1); 37 | } 38 | 39 | static zend_function_entry kindle_methods[] = { 40 | PHP_ME(kindle, pressNext, NULL, ZEND_ACC_PUBLIC) 41 | PHP_ME(kindle, unlock, NULL, ZEND_ACC_PUBLIC) 42 | PHP_ME(kindle, getPage, NULL, ZEND_ACC_PUBLIC) 43 | PHP_FE_END 44 | }; 45 | 46 | PHP_DESIGN_STARTUP_FUNCTION(kindle) 47 | { 48 | zend_string *ebook_interface_name, *ebook_interface_name_tolower; 49 | zend_class_entry kindle_container_ce; 50 | 51 | ebook_interface_name = strpprintf(0, "PHPDesign\\EBookInterface"); 52 | ebook_interface_name_tolower = zend_string_tolower(ebook_interface_name); 53 | INIT_CLASS_ENTRY(kindle_container_ce, "PHPDesign\\Kindle", kindle_methods); 54 | kindle_ce = zend_register_internal_class(&kindle_container_ce TSRMLS_CC); 55 | 56 | if ((ebook_interface_ce = zend_hash_find_ptr(CG(class_table), ebook_interface_name_tolower)) == NULL) { 57 | php_error_docref(NULL TSRMLS_CC, E_ERROR, "Can note implement ebook interface"); 58 | return FAILURE; 59 | } 60 | 61 | /* declare book class member */ 62 | zend_declare_property_long(kindle_ce, ZEND_STRL("pageNum"), 0, ZEND_ACC_PRIVATE); 63 | zend_declare_property_long(kindle_ce, ZEND_STRL("pageNumTotal"), 100, ZEND_ACC_PRIVATE); 64 | zend_class_implements(kindle_ce, 1, ebook_interface_ce); 65 | zend_string_release(ebook_interface_name); 66 | zend_string_release(ebook_interface_name_tolower); 67 | return SUCCESS; 68 | } 69 | 70 | -------------------------------------------------------------------------------- /commander/receiver.c: -------------------------------------------------------------------------------- 1 | #ifdef HAVE_CONFIG_H 2 | #include "config.h" 3 | #endif 4 | 5 | #include "php.h" 6 | #include "php_ini.h" 7 | #include "ext/standard/info.h" 8 | /* include global headers*/ 9 | #include "php_design_patterns.h" 10 | #include "commander/undoable_command_interface.h" 11 | #include "commander/receiver.h" 12 | 13 | ZEND_BEGIN_ARG_INFO(receiver_arg_info, 0) 14 | ZEND_ARG_INFO(0, string) 15 | ZEND_END_ARG_INFO() 16 | 17 | PHP_METHOD(receiver, write) 18 | { 19 | zval * enableDate; 20 | zval output; 21 | zval * helloWorld; 22 | zend_string * string; 23 | ZEND_PARSE_PARAMETERS_START(1, 1) 24 | Z_PARAM_ZVAL(helloWorld) 25 | ZEND_PARSE_PARAMETERS_END(); 26 | /* get $enableDate */ 27 | enableDate = zend_read_property(Z_OBJCE_P(getThis()), getThis(), ZEND_STRL("enableDate"), 0, NULL TSRMLS_CC); 28 | if (Z_TYPE_P(enableDate) == IS_TRUE && Z_STRVAL_P(helloWorld) != NULL) { 29 | string = strpprintf(0, "%s %s", Z_STRVAL_P(helloWorld), "1993-04-01"); 30 | } else { 31 | string = strpprintf(0, Z_STRVAL_P(helloWorld)); 32 | } 33 | array_init(&output); 34 | add_index_str(&output, 0, string); 35 | zend_update_property(Z_OBJCE_P(getThis()), getThis(), ZEND_STRL("output"), &output); 36 | zval_ptr_dtor(&output); 37 | zval_ptr_dtor(enableDate); 38 | zval_ptr_dtor(helloWorld); 39 | zend_string_release(string); 40 | } 41 | 42 | PHP_METHOD(receiver, getOutput) 43 | { 44 | zval * retval; 45 | retval = zend_read_property(Z_OBJCE_P(getThis()), getThis(), ZEND_STRL("output"), 0, NULL TSRMLS_CC); 46 | RETVAL_ZVAL(retval, 0, 1); 47 | } 48 | 49 | PHP_METHOD(receiver, enableDate) 50 | { 51 | ZVAL_BOOL(return_value, IS_TRUE); 52 | zend_update_property(Z_OBJCE_P(getThis()), getThis(), ZEND_STRL("enableDate"), return_value); 53 | zval_ptr_dtor(return_value); 54 | } 55 | 56 | PHP_METHOD(receiver, disableDate) 57 | { 58 | ZVAL_BOOL(return_value, IS_FALSE); 59 | zend_update_property(Z_OBJCE_P(getThis()), getThis(), ZEND_STRL("enableDate"), return_value); 60 | zval_ptr_dtor(return_value); 61 | } 62 | 63 | zend_function_entry receiver_methods[] = { 64 | PHP_ME(receiver, write, receiver_arg_info, ZEND_ACC_PUBLIC) 65 | PHP_ME(receiver, getOutput, NULL, ZEND_ACC_PUBLIC) 66 | PHP_ME(receiver, enableDate, NULL, ZEND_ACC_PUBLIC) 67 | PHP_ME(receiver, disableDate, NULL, ZEND_ACC_PUBLIC) 68 | PHP_FE_END 69 | }; 70 | 71 | PHP_DESIGN_STARTUP_FUNCTION(receiver) 72 | { 73 | zend_class_entry receiver_container_ce; 74 | INIT_CLASS_ENTRY(receiver_container_ce, "PHPDesign\\Commander\\Receiver", receiver_methods); 75 | receiver_ce = zend_register_internal_class(&receiver_container_ce); 76 | 77 | /* declare property */ 78 | zend_declare_property_bool(receiver_ce, ZEND_STRL("enableDate"), (zend_long) 0, ZEND_ACC_PRIVATE); 79 | zend_declare_property_null(receiver_ce, ZEND_STRL("output"), ZEND_ACC_PRIVATE); 80 | } 81 | -------------------------------------------------------------------------------- /commander/hello_command.c: -------------------------------------------------------------------------------- 1 | #ifdef HAVE_CONFIG_H 2 | #include "config.h" 3 | #endif 4 | 5 | #include "php.h" 6 | #include "php_ini.h" 7 | #include "ext/standard/info.h" 8 | /* include global headers*/ 9 | #include "php_design_patterns.h" 10 | #include "commander/command_interface.h" 11 | #include "commander/hello_command.h" 12 | 13 | ZEND_BEGIN_ARG_INFO(hello_command_arg_info, 0) 14 | ZEND_ARG_INFO(0, output) 15 | ZEND_END_ARG_INFO() 16 | 17 | PHP_METHOD(hello_command, __construct) 18 | { 19 | zval * output; 20 | ZEND_PARSE_PARAMETERS_START(1, 1) 21 | Z_PARAM_ZVAL(output) 22 | ZEND_PARSE_PARAMETERS_END(); 23 | /* update cmd */ 24 | hello_command_ce = Z_OBJCE_P(getThis()); 25 | zend_update_property(hello_command_ce, getThis(), ZEND_STRL("output"), output); 26 | } 27 | 28 | PHP_METHOD(hello_command, execute) 29 | { 30 | 31 | zval * object; 32 | zval function_name; 33 | zval hello_string; 34 | ZVAL_STRING(&hello_string, "Hello World "); 35 | ZVAL_STRING(&function_name, "write"); 36 | object = zend_read_property(Z_OBJCE_P(getThis()), getThis(), ZEND_STRL("output"), 0, 0 TSRMLS_CC); 37 | /* execute function */ 38 | if (call_user_function(CG(function_table), object, &function_name, return_value, (uint32_t) 1, &hello_string TSRMLS_CC) == FAILURE) { 39 | php_error_docref(NULL TSRMLS_CC, E_ERROR, "can not execute write() function"); 40 | return; 41 | } 42 | /* release zval */ 43 | zval_dtor(&function_name); 44 | zval_ptr_dtor(return_value); 45 | } 46 | 47 | zend_function_entry hello_command_methods[] = { 48 | PHP_ME(hello_command, __construct, hello_command_arg_info, ZEND_ACC_PUBLIC | ZEND_ACC_CTOR) 49 | PHP_ME(hello_command, execute, NULL, ZEND_ACC_PUBLIC) 50 | PHP_FE_END 51 | }; 52 | 53 | PHP_DESIGN_STARTUP_FUNCTION(hello_command) 54 | { 55 | zend_class_entry hello_command_container_ce; 56 | zend_string * command_interface_name, * command_interface_name_tolower; 57 | INIT_CLASS_ENTRY(hello_command_container_ce, "PHPDesign\\Commander\\HelloCommand", hello_command_methods); 58 | hello_command_ce = zend_register_internal_class(&hello_command_container_ce); 59 | command_interface_name = strpprintf(0, "PHPDesign\\Commander\\CommandInterface"); 60 | command_interface_name_tolower = zend_string_tolower(command_interface_name); 61 | /* get command_interface_ce */ 62 | if ((command_interface_ce = zend_hash_find_ptr(CG(class_table), command_interface_name_tolower)) == NULL) { 63 | php_error_docref(NULL TSRMLS_CC, E_ERROR, "Can not Find PHPDesign\\Commander\\CommandInterface HC"); 64 | return FAILURE; 65 | } 66 | zend_class_implements(hello_command_ce, 1, command_interface_ce); 67 | zend_declare_property_null(hello_command_ce, ZEND_STRL("output"), ZEND_ACC_PRIVATE); 68 | zend_string_release(command_interface_name); 69 | zend_string_release(command_interface_name_tolower); 70 | return SUCCESS; 71 | } 72 | -------------------------------------------------------------------------------- /php_design_patterns.h: -------------------------------------------------------------------------------- 1 | /* 2 | +----------------------------------------------------------------------+ 3 | | PHP Version 7 | 4 | +----------------------------------------------------------------------+ 5 | | Copyright (c) 1997-2017 The PHP Group | 6 | +----------------------------------------------------------------------+ 7 | | This source file is subject to version 3.01 of the PHP license, | 8 | | that is bundled with this package in the file LICENSE, and is | 9 | | available through the world-wide-web at the following url: | 10 | | http://www.php.net/license/3_01.txt | 11 | | If you did not receive a copy of the PHP license and are unable to | 12 | | obtain it through the world-wide-web, please send a note to | 13 | | license@php.net so we can mail you a copy immediately. | 14 | +----------------------------------------------------------------------+ 15 | | Author: | 16 | +----------------------------------------------------------------------+ 17 | */ 18 | 19 | /* $Id$ */ 20 | 21 | #ifndef PHP_DESIGN_PATTERNS_H 22 | #define PHP_DESIGN_PATTERNS_H 23 | 24 | extern zend_module_entry php_design_patterns_module_entry; 25 | #define phpext_php_design_patterns_ptr &php_design_patterns_module_entry 26 | 27 | #define PHP_DESIGN_PATTERNS_VERSION "0.1.0" /* Replace with version number for your extension */ 28 | 29 | #ifdef PHP_WIN32 30 | # define PHP_PHP_DESIGN_PATTERNS_API __declspec(dllexport) 31 | #elif defined(__GNUC__) && __GNUC__ >= 4 32 | # define PHP_DESIGN_PATTERNS_API __attribute__ ((visibility("default"))) 33 | #else 34 | # define PHP_DESIGN_PATTERNS_API 35 | #endif 36 | 37 | #ifdef ZTS 38 | #include "TSRM.h" 39 | #endif 40 | 41 | /* 42 | Declare any global variables you may need between the BEGIN 43 | and END macros here: 44 | 45 | ZEND_BEGIN_MODULE_GLOBALS(php_design_patterns) 46 | zend_long global_value; 47 | char *global_string; 48 | ZEND_END_MODULE_GLOBALS(php_design_patterns) 49 | */ 50 | #define PHP_DESIGN_STARTUP(module) ZEND_MODULE_STARTUP_N(php_design_patterns_##module)(INIT_FUNC_ARGS_PASSTHRU) 51 | #define PHP_DESIGN_STARTUP_FUNCTION(module) ZEND_MINIT_FUNCTION(php_design_patterns_##module) 52 | /* Always refer to the globals in your function as PHP_DESIGN_PATTERNS_G(variable). 53 | You are encouraged to rename these macros something shorter, see 54 | examples in any other php module directory. 55 | */ 56 | #define PHP_DESIGN_PATTERNS_G(v) ZEND_MODULE_GLOBALS_ACCESSOR(php_design_patterns, v) 57 | 58 | #if defined(ZTS) && defined(COMPILE_DL_PHP_DESIGN_PATTERNS) 59 | #endif 60 | #endif /* PHP_PHP_DESIGN_PATTERNS_H */ 61 | 62 | 63 | /* 64 | * Local variables: 65 | * tab-width: 4 66 | * c-basic-offset: 4 67 | * End: 68 | * vim600: noet sw=4 ts=4 fdm=marker 69 | * vim<600: noet sw=4 ts=4 70 | */ 71 | -------------------------------------------------------------------------------- /dependencyInjection/database_connection.c: -------------------------------------------------------------------------------- 1 | #ifdef HAVE_CONFIG_H 2 | #include "config.h" 3 | #endif 4 | 5 | #include "php.h" 6 | 7 | /* include global headers*/ 8 | #include "php_design_patterns.h" 9 | #include "dependencyInjection/database_connection.h" 10 | 11 | ZEND_BEGIN_ARG_INFO(database_connection_arg_info, 0) 12 | ZEND_ARG_INFO(0, configuration) 13 | ZEND_END_ARG_INFO() 14 | 15 | 16 | PHP_METHOD(database_connection, __construct) 17 | { 18 | zval *config; 19 | ZEND_PARSE_PARAMETERS_START(1, 1) 20 | Z_PARAM_ZVAL(config) 21 | ZEND_PARSE_PARAMETERS_END(); 22 | database_connection_ce = Z_OBJCE_P(getThis()); 23 | /* update $configuration */ 24 | zend_update_property(database_connection_ce, getThis(), ZEND_STRL("configuration"), config TSRMLS_CC); 25 | } 26 | 27 | PHP_METHOD(database_connection, getDsn) 28 | { 29 | zval *object; 30 | zval getUsername, getPassword, getHost, getPort; 31 | zval username, password, host, port; 32 | /* set function name */ 33 | ZVAL_STRING(&getUsername, "getUsername"); 34 | ZVAL_STRING(&getPassword, "getPassword"); 35 | ZVAL_STRING(&getHost, "getHost"); 36 | ZVAL_STRING(&getPort, "getPort"); 37 | /* get class ce */ 38 | database_connection_ce = Z_OBJCE_P(getThis()); 39 | 40 | /* get class object */ 41 | object = zend_read_property(database_connection_ce, getThis(), ZEND_STRL("configuration"), 0, 0 TSRMLS_CC); 42 | 43 | call_user_function(CG(function_table), object, &getUsername, return_value, ZEND_NUM_ARGS(), NULL TSRMLS_CC); 44 | ZVAL_STRING(&username, Z_STRVAL_P(return_value)); 45 | 46 | call_user_function(CG(function_table), object, &getPassword, return_value, ZEND_NUM_ARGS(), NULL TSRMLS_CC); 47 | ZVAL_STRING(&password, Z_STRVAL_P(return_value)); 48 | 49 | call_user_function(CG(function_table), object, &getHost, return_value, ZEND_NUM_ARGS(), NULL TSRMLS_CC); 50 | ZVAL_STRING(&host, Z_STRVAL_P(return_value)); 51 | 52 | call_user_function(CG(function_table), object, &getPort, return_value, ZEND_NUM_ARGS(), NULL TSRMLS_CC); 53 | ZVAL_STRING(&port, Z_STRVAL_P(return_value)); 54 | 55 | php_printf( 56 | "%s:%s@:%s:%s\n", 57 | Z_STRVAL(username), 58 | Z_STRVAL(password), 59 | Z_STRVAL(host), 60 | Z_STRVAL(port) 61 | ); 62 | zval_dtor(&getPassword); 63 | zval_dtor(&getUsername); 64 | zval_dtor(&getPort); 65 | zval_dtor(&getHost); 66 | zval_dtor(&username); 67 | zval_dtor(&password); 68 | zval_dtor(&host); 69 | zval_dtor(&port); 70 | zval_ptr_dtor(return_value); 71 | } 72 | 73 | zend_function_entry database_connection_methods[] = { 74 | PHP_ME(database_connection, __construct, database_connection_arg_info, ZEND_ACC_CTOR | ZEND_ACC_PUBLIC) 75 | PHP_ME(database_connection, getDsn, NULL, ZEND_ACC_PUBLIC) 76 | PHP_FE_END 77 | }; 78 | 79 | PHP_DESIGN_STARTUP_FUNCTION(database_connection) 80 | { 81 | zend_class_entry database_connection_container_ce; 82 | /* register class */ 83 | INIT_CLASS_ENTRY(database_connection_container_ce, "PHPDesign\\DI\\DatabaseConnection", database_connection_methods); 84 | database_connection_ce = zend_register_internal_class(&database_connection_container_ce TSRMLS_CC); 85 | 86 | /* declare class member */ 87 | zend_declare_property_null(database_connection_ce, ZEND_STRL("configuration"), ZEND_ACC_PRIVATE); 88 | } 89 | -------------------------------------------------------------------------------- /dependencyInjection/database_configuration.c: -------------------------------------------------------------------------------- 1 | #ifdef HAVE_CONFIG_H 2 | #include "config.h" 3 | #endif 4 | 5 | #include "php.h" 6 | 7 | /* include global headers*/ 8 | #include "php_design_patterns.h" 9 | #include "dependencyInjection/database_configuration.h" 10 | 11 | ZEND_BEGIN_ARG_INFO(database_configuration_arg_info, 0) 12 | ZEND_ARG_INFO(0, host) 13 | ZEND_ARG_INFO(0, port) 14 | ZEND_ARG_INFO(0, username) 15 | ZEND_ARG_INFO(0, password) 16 | ZEND_END_ARG_INFO() 17 | 18 | 19 | PHP_METHOD(database_configuration, __construct) 20 | { 21 | zval * host, * port, * username, * password; 22 | ZEND_PARSE_PARAMETERS_START(4, 4) 23 | Z_PARAM_ZVAL(host) 24 | Z_PARAM_ZVAL(port) 25 | Z_PARAM_ZVAL(username) 26 | Z_PARAM_ZVAL(password) 27 | ZEND_PARSE_PARAMETERS_END(); 28 | zend_update_property(database_configuration_ce, getThis(), ZEND_STRL("host"), host); 29 | zend_update_property(database_configuration_ce, getThis(), ZEND_STRL("port"), port); 30 | zend_update_property(database_configuration_ce, getThis(), ZEND_STRL("username"), username); 31 | zend_update_property(database_configuration_ce, getThis(), ZEND_STRL("password"), password); 32 | } 33 | 34 | PHP_METHOD(database_configuration, getHost) 35 | { 36 | zval * host; 37 | host = zend_read_property(Z_OBJCE_P(getThis()), getThis(), ZEND_STRL("host"), 0, 0 TSRMLS_CC); 38 | RETURN_ZVAL(host, 0, 1); 39 | } 40 | 41 | PHP_METHOD(database_configuration, getPort) 42 | { 43 | 44 | zval * port; 45 | port = zend_read_property(Z_OBJCE_P(getThis()), getThis(), ZEND_STRL("port"), 0, 0 TSRMLS_CC); 46 | RETURN_ZVAL(port, 0, 1); 47 | } 48 | 49 | PHP_METHOD(database_configuration, getUsername) 50 | { 51 | 52 | zval * username; 53 | username = zend_read_property(Z_OBJCE_P(getThis()), getThis(), ZEND_STRL("username"), 0, 0 TSRMLS_CC); 54 | RETURN_ZVAL(username, 0, 1); 55 | } 56 | 57 | PHP_METHOD(database_configuration, getPassword) 58 | { 59 | 60 | zval * password; 61 | password = zend_read_property(Z_OBJCE_P(getThis()), getThis(), ZEND_STRL("password"), 0, 0 TSRMLS_CC); 62 | RETURN_ZVAL(password, 0, 1); 63 | } 64 | 65 | zend_function_entry database_configuration_methods[] = { 66 | PHP_ME(database_configuration, __construct, database_configuration_arg_info, ZEND_ACC_CTOR | ZEND_ACC_PUBLIC) 67 | PHP_ME(database_configuration, getHost, NULL, ZEND_ACC_PUBLIC) 68 | PHP_ME(database_configuration, getPort, NULL, ZEND_ACC_PUBLIC) 69 | PHP_ME(database_configuration, getPassword, NULL, ZEND_ACC_PUBLIC) 70 | PHP_ME(database_configuration, getUsername, NULL, ZEND_ACC_PUBLIC) 71 | PHP_FE_END 72 | }; 73 | 74 | PHP_DESIGN_STARTUP_FUNCTION(database_configuration) 75 | { 76 | zend_class_entry database_configuration_container_ce; 77 | /* register class */ 78 | INIT_CLASS_ENTRY(database_configuration_container_ce, "PHPDesign\\DI\\DatabaseConfiguration", database_configuration_methods); 79 | database_configuration_ce = zend_register_internal_class(&database_configuration_container_ce TSRMLS_CC); 80 | 81 | /* declare class member */ 82 | zend_declare_property_null(database_configuration_ce, ZEND_STRL("host"), ZEND_ACC_PRIVATE); 83 | zend_declare_property_null(database_configuration_ce, ZEND_STRL("port"), ZEND_ACC_PRIVATE); 84 | zend_declare_property_null(database_configuration_ce, ZEND_STRL("usrname"), ZEND_ACC_PRIVATE); 85 | zend_declare_property_null(database_configuration_ce, ZEND_STRL("password"), ZEND_ACC_PRIVATE); 86 | } 87 | -------------------------------------------------------------------------------- /facade/facade.c: -------------------------------------------------------------------------------- 1 | #ifdef HAVE_CONFIG_H 2 | #include "config.h" 3 | #endif 4 | 5 | #include "php.h" 6 | 7 | ZEND_BEGIN_ARG_INFO(facade_arg_info, 0) 8 | ZEND_ARG_INFO(0, os) 9 | ZEND_ARG_INFO(0, bios) 10 | ZEND_END_ARG_INFO() 11 | 12 | /* include global headers*/ 13 | #include "php_design_patterns.h" 14 | #include "facade/facade.h" 15 | 16 | 17 | PHP_METHOD(facade, __construct) 18 | { 19 | zval *bios, *os; 20 | 21 | ZEND_PARSE_PARAMETERS_START(2, 2) 22 | Z_PARAM_ZVAL(os) 23 | Z_PARAM_ZVAL(bios) 24 | ZEND_PARSE_PARAMETERS_END(); 25 | 26 | facade_ce = Z_OBJCE_P(getThis()); 27 | /* Update Facade Property*/ 28 | zend_update_property(facade_ce, getThis(), ZEND_STRL("os"), os); 29 | zend_update_property(facade_ce, getThis(), ZEND_STRL("bios"), bios); 30 | } 31 | 32 | PHP_METHOD(facade, turnOn) 33 | { 34 | zval *bios_object, *os_object; 35 | zval execute_name, wait_for_key_press_name, launch_name; 36 | 37 | /* Set Function Name */ 38 | ZVAL_STRING(&execute_name, "execute"); 39 | ZVAL_STRING(&wait_for_key_press_name, "waitForKeyPress"); 40 | ZVAL_STRING(&launch_name, "launch"); 41 | 42 | facade_ce = Z_OBJCE_P(getThis()); 43 | 44 | os_object = zend_read_property(facade_ce , getThis(), ZEND_STRL("os"), 0, 0 TSRMLS_CC); 45 | /* Get $this->bios */ 46 | bios_object = zend_read_property(facade_ce , getThis(), ZEND_STRL("bios"), 0, 0 TSRMLS_CC); 47 | /* Execute $this->bios->execute() */ 48 | call_user_function(CG(function_table), bios_object, &execute_name, return_value, ZEND_NUM_ARGS(), NULL TSRMLS_CC); 49 | call_user_function(CG(function_table), bios_object, &wait_for_key_press_name, return_value, ZEND_NUM_ARGS(), NULL TSRMLS_CC); 50 | call_user_function(CG(function_table), bios_object, &launch_name, return_value, ZEND_NUM_ARGS(), os_object TSRMLS_CC); 51 | 52 | zval_dtor(&execute_name); 53 | zval_dtor(&wait_for_key_press_name); 54 | zval_dtor(&launch_name); 55 | } 56 | 57 | 58 | PHP_METHOD(facade, turnOff) 59 | { 60 | 61 | zval *bios_object, *os_object; 62 | zval halt_name, power_down_name; 63 | facade_ce = Z_OBJCE_P(getThis()); 64 | 65 | ZVAL_STRING(&halt_name, "halt"); 66 | ZVAL_STRING(&power_down_name, "powerDown"); 67 | 68 | os_object = zend_read_property(facade_ce , getThis(), ZEND_STRL("os"), 0, 0 TSRMLS_CC); 69 | /* Get $this->bios */ 70 | bios_object = zend_read_property(facade_ce , getThis(), ZEND_STRL("bios"), 0, 0 TSRMLS_CC); 71 | 72 | call_user_function(CG(function_table), bios_object, &power_down_name, return_value, ZEND_NUM_ARGS(), NULL TSRMLS_CC); 73 | call_user_function(CG(function_table), os_object, &halt_name, return_value, ZEND_NUM_ARGS(), NULL TSRMLS_CC); 74 | zval_dtor(&halt_name); 75 | zval_dtor(&power_down_name); 76 | } 77 | 78 | static zend_function_entry facade_methods[] = { 79 | PHP_ME(facade, __construct, facade_arg_info, ZEND_ACC_CTOR | ZEND_ACC_PUBLIC) 80 | PHP_ME(facade, turnOn, NULL, ZEND_ACC_PUBLIC) 81 | PHP_ME(facade, turnOff, NULL, ZEND_ACC_PUBLIC) 82 | PHP_FE_END 83 | }; 84 | 85 | PHP_DESIGN_STARTUP_FUNCTION(facade) 86 | { 87 | zend_class_entry facade_container_ce; 88 | INIT_CLASS_ENTRY(facade_container_ce, "PHPDesign\\Facade\\Facade", facade_methods); 89 | facade_ce = zend_register_internal_class(&facade_container_ce TSRMLS_CC); 90 | 91 | /* Declare $os */ 92 | zend_declare_property_null(facade_ce, ZEND_STRL("os"), ZEND_ACC_PUBLIC); 93 | /* Declare $bios */ 94 | zend_declare_property_null(facade_ce, ZEND_STRL("bios"), ZEND_ACC_PUBLIC); 95 | 96 | return SUCCESS; 97 | } 98 | -------------------------------------------------------------------------------- /adapter/ebook_adapter.c: -------------------------------------------------------------------------------- 1 | #ifdef HAVE_CONFIG_H 2 | #include "config.h" 3 | #endif 4 | 5 | #include "php.h" 6 | #include "php_ini.h" 7 | #include "ext/standard/info.h" 8 | /* include global headers*/ 9 | #include "php_design_patterns.h" 10 | #include "adapter/book_interface.h" 11 | #include "adapter/ebook_adapter.h" 12 | 13 | ZEND_BEGIN_ARG_INFO(ebook_adapter_arg_info, 0) 14 | ZEND_ARG_INFO(0, ebook_object) 15 | ZEND_END_ARG_INFO() 16 | 17 | static zend_class_entry *ebook_adapter_ce; 18 | 19 | PHP_METHOD(ebook_adapter, __construct) 20 | { 21 | zval * object; 22 | ZEND_PARSE_PARAMETERS_START(1, 1) 23 | Z_PARAM_ZVAL(object) 24 | ZEND_PARSE_PARAMETERS_END(); 25 | 26 | ebook_adapter_ce = Z_OBJCE_P(getThis()); 27 | zend_update_property(ebook_adapter_ce, getThis(), ZEND_STRL("ebook"), object); 28 | } 29 | 30 | PHP_METHOD(ebook_adapter, open) 31 | { 32 | zval *object; 33 | 34 | zval function_name; 35 | ZVAL_STRING(&function_name, "unlock"); 36 | ebook_adapter_ce = Z_OBJCE_P(getThis()); 37 | object = zend_read_property(ebook_adapter_ce, getThis(), ZEND_STRL("ebook"), 0, 0 TSRMLS_CC); 38 | call_user_function(CG(function_table), object, &function_name, return_value, ZEND_NUM_ARGS(), NULL TSRMLS_CC); 39 | zval_dtor(&function_name); 40 | zval_ptr_dtor(return_value); 41 | } 42 | 43 | PHP_METHOD(ebook_adapter, turnPage) 44 | { 45 | zval *object; 46 | zval function_name; 47 | ZVAL_STRING(&function_name, "pressNext"); 48 | ebook_adapter_ce = Z_OBJCE_P(getThis()); 49 | object = zend_read_property(ebook_adapter_ce, getThis(), ZEND_STRL("ebook"), 0, 0 TSRMLS_CC); 50 | call_user_function(CG(function_table), object, &function_name, return_value, ZEND_NUM_ARGS(), NULL TSRMLS_CC); 51 | zval_dtor(&function_name); 52 | zval_ptr_dtor(return_value); 53 | } 54 | 55 | PHP_METHOD(ebook_adapter, getPage) 56 | { 57 | 58 | zval *object; 59 | zval function_name; 60 | ZVAL_STRING(&function_name, "getPage"); 61 | ebook_adapter_ce = Z_OBJCE_P(getThis()); 62 | object = zend_read_property(ebook_adapter_ce, getThis(), ZEND_STRL("ebook"), 0, 0 TSRMLS_CC); 63 | call_user_function(CG(function_table), object, &function_name, return_value, ZEND_NUM_ARGS(), NULL TSRMLS_CC); 64 | zval_dtor(&function_name); 65 | } 66 | 67 | static zend_function_entry ebook_adapter_methods[] = { 68 | PHP_ME(ebook_adapter, __construct, NULL, ZEND_ACC_PUBLIC|ZEND_ACC_CTOR) 69 | PHP_ME(ebook_adapter, open, NULL, ZEND_ACC_PUBLIC) 70 | PHP_ME(ebook_adapter, turnPage, NULL, ZEND_ACC_PUBLIC) 71 | PHP_ME(ebook_adapter, getPage, NULL, ZEND_ACC_PUBLIC) 72 | PHP_FE_END 73 | }; 74 | 75 | PHP_DESIGN_STARTUP_FUNCTION(ebook_adapter) 76 | { 77 | zend_string *book_interface_name, *book_interface_name_tolower; 78 | zend_class_entry ebook_adapter_container_ce; 79 | book_interface_name = strpprintf(0, "PHPDesign\\BookInterface"); 80 | book_interface_name_tolower = zend_string_tolower(book_interface_name); 81 | INIT_CLASS_ENTRY(ebook_adapter_container_ce, "PHPDesign\\EBookAdapter", ebook_adapter_methods); 82 | ebook_adapter_ce = zend_register_internal_class(&ebook_adapter_container_ce TSRMLS_CC); 83 | if ((book_interface_ce = zend_hash_find_ptr(CG(class_table), book_interface_name_tolower)) == NULL) { 84 | php_error_docref(NULL TSRMLS_CC, E_ERROR, "Can not implement book_interface"); 85 | return FAILURE; 86 | } 87 | zend_declare_property_null(ebook_adapter_ce, ZEND_STRL("ebook"), ZEND_ACC_PROTECTED); 88 | zend_class_implements(ebook_adapter_ce TSRMLS_CC, 1, book_interface_ce); 89 | zend_string_release(book_interface_name); 90 | zend_string_release(book_interface_name_tolower); 91 | return SUCCESS; 92 | } 93 | -------------------------------------------------------------------------------- /config.m4: -------------------------------------------------------------------------------- 1 | dnl $Id$ 2 | dnl config.m4 for extension php_design_patterns 3 | 4 | dnl Comments in this file start with the string 'dnl'. 5 | dnl Remove where necessary. This file will not work 6 | dnl without editing. 7 | 8 | dnl If your extension references something external, use with: 9 | 10 | PHP_ARG_WITH(php_design_patterns, for php_design_patterns support, 11 | dnl Make sure that the comment is aligned: 12 | [ --with-php_design_patterns Include php_design_patterns support]) 13 | 14 | dnl Otherwise use enable: 15 | 16 | dnl PHP_ARG_ENABLE(php_design_patterns, whether to enable php_design_patterns support, 17 | dnl Make sure that the comment is aligned: 18 | dnl [ --enable-php_design_patterns Enable php_design_patterns support]) 19 | 20 | if test "$PHP_PHP_DESIGN_PATTERNS" != "no"; then 21 | dnl Write more examples of tests here... 22 | 23 | dnl # --with-php_design_patterns -> check with-path 24 | dnl SEARCH_PATH="/usr/local /usr" # you might want to change this 25 | dnl SEARCH_FOR="/include/php_design_patterns.h" # you most likely want to change this 26 | dnl if test -r $PHP_PHP_DESIGN_PATTERNS/$SEARCH_FOR; then # path given as parameter 27 | dnl PHP_DESIGN_PATTERNS_DIR=$PHP_PHP_DESIGN_PATTERNS 28 | dnl else # search default path list 29 | dnl AC_MSG_CHECKING([for php_design_patterns files in default path]) 30 | dnl for i in $SEARCH_PATH ; do 31 | dnl if test -r $i/$SEARCH_FOR; then 32 | dnl PHP_DESIGN_PATTERNS_DIR=$i 33 | dnl AC_MSG_RESULT(found in $i) 34 | dnl fi 35 | dnl done 36 | dnl fi 37 | dnl 38 | dnl if test -z "$PHP_DESIGN_PATTERNS_DIR"; then 39 | dnl AC_MSG_RESULT([not found]) 40 | dnl AC_MSG_ERROR([Please reinstall the php_design_patterns distribution]) 41 | dnl fi 42 | 43 | dnl # --with-php_design_patterns -> add include path 44 | dnl PHP_ADD_INCLUDE($PHP_DESIGN_PATTERNS_DIR/include) 45 | 46 | dnl # --with-php_design_patterns -> check for lib and symbol presence 47 | dnl LIBNAME=php_design_patterns # you may want to change this 48 | dnl LIBSYMBOL=php_design_patterns # you most likely want to change this 49 | 50 | dnl PHP_CHECK_LIBRARY($LIBNAME,$LIBSYMBOL, 51 | dnl [ 52 | dnl PHP_ADD_LIBRARY_WITH_PATH($LIBNAME, $PHP_DESIGN_PATTERNS_DIR/$PHP_LIBDIR, PHP_DESIGN_PATTERNS_SHARED_LIBADD) 53 | dnl AC_DEFINE(HAVE_PHP_DESIGN_PATTERNSLIB,1,[ ]) 54 | dnl ],[ 55 | dnl AC_MSG_ERROR([wrong php_design_patterns lib version or lib not found]) 56 | dnl ],[ 57 | dnl -L$PHP_DESIGN_PATTERNS_DIR/$PHP_LIBDIR -lm 58 | dnl ]) 59 | dnl 60 | dnl PHP_SUBST(PHP_DESIGN_PATTERNS_SHARED_LIBADD) 61 | 62 | PHP_NEW_EXTENSION( 63 | php_design_patterns, 64 | abstractFactory/mac_factory.c \ 65 | abstractFactory/win_factory.c \ 66 | abstractFactory/abstract_factory.c \ 67 | adapter/book.c \ 68 | adapter/book_interface.c \ 69 | adapter/ebook_adapter.c \ 70 | adapter/ebook_interface.c \ 71 | adapter/kindle.c \ 72 | bridge/formatter_interface.c \ 73 | bridge/hello_world_service.c \ 74 | bridge/html_formatter.c \ 75 | bridge/plain_text_formatter.c \ 76 | bridge/service.c \ 77 | facade/bios.c \ 78 | facade/bios_interface.c \ 79 | facade/facade.c \ 80 | facade/linux_os.c \ 81 | facade/os_interface.c \ 82 | dependencyInjection/database_configuration.c \ 83 | dependencyInjection/database_connection.c \ 84 | commander/add_message_date_command.c \ 85 | commander/command_interface.c \ 86 | commander/hello_command.c \ 87 | commander/invoker.c \ 88 | commander/receiver.c \ 89 | commander/undoable_command_interface.c \ 90 | php_design_patterns.c, 91 | $ext_shared, 92 | ) 93 | PHP_ADD_BUILD_DIR([$ext_builddir/abstract_factory]) 94 | fi 95 | -------------------------------------------------------------------------------- /commander/add_message_date_command.c: -------------------------------------------------------------------------------- 1 | #ifdef HAVE_CONFIG_H 2 | #include "config.h" 3 | #endif 4 | 5 | #include "php.h" 6 | #include "php_ini.h" 7 | #include "ext/standard/info.h" 8 | /* include global headers*/ 9 | #include "php_design_patterns.h" 10 | #include "commander/undoable_command_interface.h" 11 | #include "commander/command_interface.h" 12 | #include "commander/add_message_date_command.h" 13 | 14 | ZEND_BEGIN_ARG_INFO(add_msg_date_cmd_arg_info, 0) 15 | ZEND_ARG_INFO(0, output) 16 | ZEND_END_ARG_INFO() 17 | 18 | PHP_METHOD(add_msg_date_cmd, __construct) 19 | { 20 | zval * output; 21 | ZEND_PARSE_PARAMETERS_START(1, 1) 22 | Z_PARAM_ZVAL(output) 23 | ZEND_PARSE_PARAMETERS_END(); 24 | zend_update_property(Z_OBJCE_P(getThis()), getThis(), ZEND_STRL("output"), output); 25 | zval_ptr_dtor(output); 26 | } 27 | 28 | PHP_METHOD(add_msg_date_cmd, execute) 29 | { 30 | zval * object; 31 | zval function_name; 32 | ZVAL_STRING(&function_name, "enableDate"); 33 | object = zend_read_property(Z_OBJCE_P(getThis()), getThis(), ZEND_STRL("output"), 0, 0 TSRMLS_CC); 34 | /* execute function */ 35 | if (call_user_function(CG(function_table), object, &function_name, return_value, ZEND_NUM_ARGS(), NULL TSRMLS_CC) == FAILURE) { 36 | php_error_docref(NULL TSRMLS_CC, E_ERROR, "can not execute enableDate() function"); 37 | return; 38 | } 39 | /* release zval */ 40 | zval_dtor(&function_name); 41 | zval_ptr_dtor(return_value); 42 | } 43 | 44 | PHP_METHOD(add_msg_date_cmd, undo) 45 | { 46 | zval * object; 47 | zval function_name; 48 | ZVAL_STRING(&function_name, "disableDate"); 49 | object = zend_read_property(Z_OBJCE_P(getThis()), getThis(), ZEND_STRL("output"), 0, 0 TSRMLS_CC); 50 | /* execute function */ 51 | if (call_user_function(CG(function_table), object, &function_name, return_value, ZEND_NUM_ARGS(), NULL TSRMLS_CC) == FAILURE) { 52 | php_error_docref(NULL TSRMLS_CC, E_ERROR, "can not execute disableDate() function"); 53 | return; 54 | } 55 | /* release zval */ 56 | zval_dtor(&function_name); 57 | zval_ptr_dtor(return_value); 58 | } 59 | 60 | zend_function_entry add_msg_date_cmd_methods[] = { 61 | PHP_ME(add_msg_date_cmd, __construct, add_msg_date_cmd_arg_info, ZEND_ACC_PUBLIC | ZEND_ACC_CTOR) 62 | PHP_ME(add_msg_date_cmd, execute, NULL, ZEND_ACC_PUBLIC) 63 | PHP_ME(add_msg_date_cmd, undo, NULL, ZEND_ACC_PUBLIC) 64 | PHP_FE_END 65 | }; 66 | 67 | PHP_DESIGN_STARTUP_FUNCTION(add_msg_date_cmd) 68 | { 69 | zend_class_entry add_msg_date_cmd_container_ce; 70 | zend_string * ud_command_interface_name, * ud_command_interface_name_tolower; 71 | zend_string * command_interface_name, * command_interface_name_tolower; 72 | command_interface_name = strpprintf(0, "PHPDesign\\Commander\\CommandInterface"); 73 | command_interface_name_tolower = zend_string_tolower(command_interface_name); 74 | ud_command_interface_name = strpprintf(0, "PHPDesign\\Commander\\UndoableCommandInterface"); 75 | ud_command_interface_name_tolower = zend_string_tolower(ud_command_interface_name); 76 | 77 | INIT_CLASS_ENTRY(add_msg_date_cmd_container_ce, "PHPDesign\\Commander\\AddMessageDateCommand", add_msg_date_cmd_methods); 78 | add_msg_date_cmd_ce = zend_register_internal_class(&add_msg_date_cmd_container_ce); 79 | 80 | if ((ud_command_interface_ce = zend_hash_find_ptr(CG(class_table), ud_command_interface_name_tolower)) == NULL) { 81 | php_error_docref(NULL TSRMLS_CC, E_ERROR, "Can not Find PHPDesign\\Commander\\UndoableCommandInterface"); 82 | return FAILURE; 83 | } 84 | 85 | /* get command_interface_ce */ 86 | if ((command_interface_ce = zend_hash_find_ptr(CG(class_table), command_interface_name_tolower)) == NULL) { 87 | php_error_docref(NULL TSRMLS_CC, E_ERROR, "Can not Find PHPDesign\\Commander\\CommandInterface"); 88 | return FAILURE; 89 | } 90 | zend_class_implements(add_msg_date_cmd_ce, 2, ud_command_interface_ce, command_interface_ce); 91 | zend_declare_property_null(add_msg_date_cmd_ce, ZEND_STRL("output"), ZEND_ACC_PRIVATE); 92 | /* release zend string */ 93 | zend_string_release(command_interface_name); 94 | zend_string_release(command_interface_name_tolower); 95 | zend_string_release(ud_command_interface_name); 96 | zend_string_release(ud_command_interface_name_tolower); 97 | return SUCCESS; 98 | } 99 | -------------------------------------------------------------------------------- /php_design_patterns.c: -------------------------------------------------------------------------------- 1 | /* 2 | +----------------------------------------------------------------------+ 3 | | PHP Version 7 | 4 | +----------------------------------------------------------------------+ 5 | | Copyright (c) 1997-2017 The PHP Group | 6 | +----------------------------------------------------------------------+ 7 | | This source file is subject to version 3.01 of the PHP license, | 8 | | that is bundled with this package in the file LICENSE, and is | 9 | | available through the world-wide-web at the following url: | 10 | | http://www.php.net/license/3_01.txt | 11 | | If you did not receive a copy of the PHP license and are unable to | 12 | | obtain it through the world-wide-web, please send a note to | 13 | | license@php.net so we can mail you a copy immediately. | 14 | +----------------------------------------------------------------------+ 15 | | Author: | 16 | +----------------------------------------------------------------------+ 17 | */ 18 | 19 | /* $Id$ */ 20 | 21 | #ifdef HAVE_CONFIG_H 22 | #include "config.h" 23 | #endif 24 | 25 | #include "php.h" 26 | #include "php_ini.h" 27 | #include "ext/standard/info.h" 28 | #include "php_design_patterns.h" 29 | #include "abstractFactory/abstract_factory.h" 30 | #include "abstractFactory/mac_factory.h" 31 | #include "abstractFactory/win_factory.h" 32 | #include "adapter/book.h" 33 | #include "adapter/ebook_adapter.h" 34 | #include "adapter/kindle.h" 35 | #include "adapter/book_interface.h" 36 | #include "adapter/ebook_interface.h" 37 | #include "adapter/kindle.h" 38 | #include "bridge/formatter_interface.h" 39 | #include "bridge/hello_world_service.h" 40 | #include "bridge/html_formatter.h" 41 | #include "bridge/plain_text_formatter.h" 42 | #include "bridge/service.h" 43 | #include "facade/bios.h" 44 | #include "facade/bios_interface.h" 45 | #include "facade/facade.h" 46 | #include "facade/linux_os.h" 47 | #include "facade/os_interface.h" 48 | #include "dependencyInjection/database_configuration.h" 49 | #include "dependencyInjection/database_connection.h" 50 | #include "commander/add_message_date_command.h" 51 | #include "commander/command_interface.h" 52 | #include "commander/hello_command.h" 53 | #include "commander/invoker.h" 54 | #include "commander/receiver.h" 55 | #include "commander/undoable_command_interface.h" 56 | 57 | 58 | /* {{{ PHP_MINIT_FUNCTION 59 | */ 60 | PHP_MINIT_FUNCTION(php_design_patterns) 61 | { 62 | /* If you have INI entries, uncomment these lines 63 | REGISTER_INI_ENTRIES(); 64 | */ 65 | /*Abstract Factory*/ 66 | PHP_DESIGN_STARTUP(abstract_factory); 67 | PHP_DESIGN_STARTUP(win_factory); 68 | PHP_DESIGN_STARTUP(mac_factory); 69 | /* Adapter */ 70 | PHP_DESIGN_STARTUP(book_interface); 71 | PHP_DESIGN_STARTUP(book); 72 | PHP_DESIGN_STARTUP(ebook_interface); 73 | PHP_DESIGN_STARTUP(ebook_adapter); 74 | PHP_DESIGN_STARTUP(kindle); 75 | /* Bridge */ 76 | PHP_DESIGN_STARTUP(service); 77 | PHP_DESIGN_STARTUP(formatter_interface); 78 | PHP_DESIGN_STARTUP(hello_world_service); 79 | PHP_DESIGN_STARTUP(html_formatter); 80 | PHP_DESIGN_STARTUP(plain_text_formatter); 81 | /* Facade */ 82 | PHP_DESIGN_STARTUP(os_interface); 83 | PHP_DESIGN_STARTUP(bios_interface); 84 | PHP_DESIGN_STARTUP(bios); 85 | PHP_DESIGN_STARTUP(linux_os); 86 | PHP_DESIGN_STARTUP(facade); 87 | 88 | /* Dependency Injection */ 89 | PHP_DESIGN_STARTUP(database_configuration); 90 | PHP_DESIGN_STARTUP(database_connection); 91 | 92 | /* Commander */ 93 | PHP_DESIGN_STARTUP(command_interface); 94 | PHP_DESIGN_STARTUP(ud_command_interface); 95 | PHP_DESIGN_STARTUP(receiver); 96 | PHP_DESIGN_STARTUP(add_msg_date_cmd); 97 | PHP_DESIGN_STARTUP(invoker); 98 | PHP_DESIGN_STARTUP(hello_command); 99 | return SUCCESS; 100 | } 101 | /* }}} */ 102 | 103 | /* {{{ PHP_MSHUTDOWN_FUNCTION 104 | */ 105 | PHP_MSHUTDOWN_FUNCTION(php_design_patterns) 106 | { 107 | /* uncomment this line if you have INI entries 108 | UNREGISTER_INI_ENTRIES(); 109 | */ 110 | return SUCCESS; 111 | } 112 | /* }}} */ 113 | 114 | /* Remove if there's nothing to do at request start */ 115 | /* {{{ PHP_RINIT_FUNCTION 116 | */ 117 | PHP_RINIT_FUNCTION(php_design_patterns) 118 | { 119 | #if defined(COMPILE_DL_PHP_DESIGN_PATTERNS) && defined(ZTS) 120 | ZEND_TSRMLS_CACHE_UPDATE(); 121 | #endif 122 | return SUCCESS; 123 | } 124 | /* }}} */ 125 | 126 | /* Remove if there's nothing to do at request end */ 127 | /* {{{ PHP_RSHUTDOWN_FUNCTION 128 | */ 129 | PHP_RSHUTDOWN_FUNCTION(php_design_patterns) 130 | { 131 | return SUCCESS; 132 | } 133 | /* }}} */ 134 | 135 | /* {{{ PHP_MINFO_FUNCTION 136 | */ 137 | PHP_MINFO_FUNCTION(php_design_patterns) 138 | { 139 | php_info_print_table_start(); 140 | php_info_print_table_header(2, "php_design_patterns support", "enabled"); 141 | php_info_print_table_end(); 142 | 143 | /* Remove comments if you have entries in php.ini 144 | DISPLAY_INI_ENTRIES(); 145 | */ 146 | } 147 | /* }}} */ 148 | 149 | 150 | /* {{{ php_design_patterns_functions[] 151 | * 152 | * Every user visible function must have an entry in php_design_patterns_functions[]. 153 | */ 154 | const zend_function_entry php_design_patterns_functions[] = { 155 | PHP_FE_END /* Must be the last line in php_design_patterns_functions[] */ 156 | }; 157 | /* }}} */ 158 | 159 | /* {{{ php_design_patterns_module_entry 160 | */ 161 | zend_module_entry php_design_patterns_module_entry = { 162 | STANDARD_MODULE_HEADER, 163 | "php_design_patterns", 164 | php_design_patterns_functions, 165 | PHP_MINIT(php_design_patterns), 166 | PHP_MSHUTDOWN(php_design_patterns), 167 | PHP_RINIT(php_design_patterns), /* Replace with NULL if there's nothing to do at request start */ 168 | PHP_RSHUTDOWN(php_design_patterns), /* Replace with NULL if there's nothing to do at request end */ 169 | PHP_MINFO(php_design_patterns), 170 | PHP_DESIGN_PATTERNS_VERSION, 171 | STANDARD_MODULE_PROPERTIES 172 | }; 173 | /* }}} */ 174 | 175 | #ifdef COMPILE_DL_PHP_DESIGN_PATTERNS 176 | #ifdef ZTS 177 | ZEND_TSRMLS_CACHE_DEFINE() 178 | #endif 179 | ZEND_GET_MODULE(php_design_patterns) 180 | #endif 181 | 182 | /* 183 | * Local variables: 184 | * tab-width: 4 185 | * c-basic-offset: 4 186 | * End: 187 | * vim600: noet sw=4 ts=4 fdm=marker 188 | * vim<600: noet sw=4 ts=4 189 | */ 190 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | GNU GENERAL PUBLIC LICENSE 2 | Version 3, 29 June 2007 3 | 4 | Copyright (C) 2007 Free Software Foundation, Inc. 5 | Everyone is permitted to copy and distribute verbatim copies 6 | of this license document, but changing it is not allowed. 7 | 8 | Preamble 9 | 10 | The GNU General Public License is a free, copyleft license for 11 | software and other kinds of works. 12 | 13 | The licenses for most software and other practical works are designed 14 | to take away your freedom to share and change the works. By contrast, 15 | the GNU General Public License is intended to guarantee your freedom to 16 | share and change all versions of a program--to make sure it remains free 17 | software for all its users. We, the Free Software Foundation, use the 18 | GNU General Public License for most of our software; it applies also to 19 | any other work released this way by its authors. You can apply it to 20 | your programs, too. 21 | 22 | When we speak of free software, we are referring to freedom, not 23 | price. Our General Public Licenses are designed to make sure that you 24 | have the freedom to distribute copies of free software (and charge for 25 | them if you wish), that you receive source code or can get it if you 26 | want it, that you can change the software or use pieces of it in new 27 | free programs, and that you know you can do these things. 28 | 29 | To protect your rights, we need to prevent others from denying you 30 | these rights or asking you to surrender the rights. Therefore, you have 31 | certain responsibilities if you distribute copies of the software, or if 32 | you modify it: responsibilities to respect the freedom of others. 33 | 34 | For example, if you distribute copies of such a program, whether 35 | gratis or for a fee, you must pass on to the recipients the same 36 | freedoms that you received. You must make sure that they, too, receive 37 | or can get the source code. And you must show them these terms so they 38 | know their rights. 39 | 40 | Developers that use the GNU GPL protect your rights with two steps: 41 | (1) assert copyright on the software, and (2) offer you this License 42 | giving you legal permission to copy, distribute and/or modify it. 43 | 44 | For the developers' and authors' protection, the GPL clearly explains 45 | that there is no warranty for this free software. For both users' and 46 | authors' sake, the GPL requires that modified versions be marked as 47 | changed, so that their problems will not be attributed erroneously to 48 | authors of previous versions. 49 | 50 | Some devices are designed to deny users access to install or run 51 | modified versions of the software inside them, although the manufacturer 52 | can do so. This is fundamentally incompatible with the aim of 53 | protecting users' freedom to change the software. The systematic 54 | pattern of such abuse occurs in the area of products for individuals to 55 | use, which is precisely where it is most unacceptable. Therefore, we 56 | have designed this version of the GPL to prohibit the practice for those 57 | products. If such problems arise substantially in other domains, we 58 | stand ready to extend this provision to those domains in future versions 59 | of the GPL, as needed to protect the freedom of users. 60 | 61 | Finally, every program is threatened constantly by software patents. 62 | States should not allow patents to restrict development and use of 63 | software on general-purpose computers, but in those that do, we wish to 64 | avoid the special danger that patents applied to a free program could 65 | make it effectively proprietary. To prevent this, the GPL assures that 66 | patents cannot be used to render the program non-free. 67 | 68 | The precise terms and conditions for copying, distribution and 69 | modification follow. 70 | 71 | TERMS AND CONDITIONS 72 | 73 | 0. Definitions. 74 | 75 | "This License" refers to version 3 of the GNU General Public License. 76 | 77 | "Copyright" also means copyright-like laws that apply to other kinds of 78 | works, such as semiconductor masks. 79 | 80 | "The Program" refers to any copyrightable work licensed under this 81 | License. Each licensee is addressed as "you". "Licensees" and 82 | "recipients" may be individuals or organizations. 83 | 84 | To "modify" a work means to copy from or adapt all or part of the work 85 | in a fashion requiring copyright permission, other than the making of an 86 | exact copy. The resulting work is called a "modified version" of the 87 | earlier work or a work "based on" the earlier work. 88 | 89 | A "covered work" means either the unmodified Program or a work based 90 | on the Program. 91 | 92 | To "propagate" a work means to do anything with it that, without 93 | permission, would make you directly or secondarily liable for 94 | infringement under applicable copyright law, except executing it on a 95 | computer or modifying a private copy. Propagation includes copying, 96 | distribution (with or without modification), making available to the 97 | public, and in some countries other activities as well. 98 | 99 | To "convey" a work means any kind of propagation that enables other 100 | parties to make or receive copies. Mere interaction with a user through 101 | a computer network, with no transfer of a copy, is not conveying. 102 | 103 | An interactive user interface displays "Appropriate Legal Notices" 104 | to the extent that it includes a convenient and prominently visible 105 | feature that (1) displays an appropriate copyright notice, and (2) 106 | tells the user that there is no warranty for the work (except to the 107 | extent that warranties are provided), that licensees may convey the 108 | work under this License, and how to view a copy of this License. If 109 | the interface presents a list of user commands or options, such as a 110 | menu, a prominent item in the list meets this criterion. 111 | 112 | 1. Source Code. 113 | 114 | The "source code" for a work means the preferred form of the work 115 | for making modifications to it. "Object code" means any non-source 116 | form of a work. 117 | 118 | A "Standard Interface" means an interface that either is an official 119 | standard defined by a recognized standards body, or, in the case of 120 | interfaces specified for a particular programming language, one that 121 | is widely used among developers working in that language. 122 | 123 | The "System Libraries" of an executable work include anything, other 124 | than the work as a whole, that (a) is included in the normal form of 125 | packaging a Major Component, but which is not part of that Major 126 | Component, and (b) serves only to enable use of the work with that 127 | Major Component, or to implement a Standard Interface for which an 128 | implementation is available to the public in source code form. A 129 | "Major Component", in this context, means a major essential component 130 | (kernel, window system, and so on) of the specific operating system 131 | (if any) on which the executable work runs, or a compiler used to 132 | produce the work, or an object code interpreter used to run it. 133 | 134 | The "Corresponding Source" for a work in object code form means all 135 | the source code needed to generate, install, and (for an executable 136 | work) run the object code and to modify the work, including scripts to 137 | control those activities. However, it does not include the work's 138 | System Libraries, or general-purpose tools or generally available free 139 | programs which are used unmodified in performing those activities but 140 | which are not part of the work. For example, Corresponding Source 141 | includes interface definition files associated with source files for 142 | the work, and the source code for shared libraries and dynamically 143 | linked subprograms that the work is specifically designed to require, 144 | such as by intimate data communication or control flow between those 145 | subprograms and other parts of the work. 146 | 147 | The Corresponding Source need not include anything that users 148 | can regenerate automatically from other parts of the Corresponding 149 | Source. 150 | 151 | The Corresponding Source for a work in source code form is that 152 | same work. 153 | 154 | 2. Basic Permissions. 155 | 156 | All rights granted under this License are granted for the term of 157 | copyright on the Program, and are irrevocable provided the stated 158 | conditions are met. This License explicitly affirms your unlimited 159 | permission to run the unmodified Program. The output from running a 160 | covered work is covered by this License only if the output, given its 161 | content, constitutes a covered work. This License acknowledges your 162 | rights of fair use or other equivalent, as provided by copyright law. 163 | 164 | You may make, run and propagate covered works that you do not 165 | convey, without conditions so long as your license otherwise remains 166 | in force. You may convey covered works to others for the sole purpose 167 | of having them make modifications exclusively for you, or provide you 168 | with facilities for running those works, provided that you comply with 169 | the terms of this License in conveying all material for which you do 170 | not control copyright. Those thus making or running the covered works 171 | for you must do so exclusively on your behalf, under your direction 172 | and control, on terms that prohibit them from making any copies of 173 | your copyrighted material outside their relationship with you. 174 | 175 | Conveying under any other circumstances is permitted solely under 176 | the conditions stated below. Sublicensing is not allowed; section 10 177 | makes it unnecessary. 178 | 179 | 3. Protecting Users' Legal Rights From Anti-Circumvention Law. 180 | 181 | No covered work shall be deemed part of an effective technological 182 | measure under any applicable law fulfilling obligations under article 183 | 11 of the WIPO copyright treaty adopted on 20 December 1996, or 184 | similar laws prohibiting or restricting circumvention of such 185 | measures. 186 | 187 | When you convey a covered work, you waive any legal power to forbid 188 | circumvention of technological measures to the extent such circumvention 189 | is effected by exercising rights under this License with respect to 190 | the covered work, and you disclaim any intention to limit operation or 191 | modification of the work as a means of enforcing, against the work's 192 | users, your or third parties' legal rights to forbid circumvention of 193 | technological measures. 194 | 195 | 4. Conveying Verbatim Copies. 196 | 197 | You may convey verbatim copies of the Program's source code as you 198 | receive it, in any medium, provided that you conspicuously and 199 | appropriately publish on each copy an appropriate copyright notice; 200 | keep intact all notices stating that this License and any 201 | non-permissive terms added in accord with section 7 apply to the code; 202 | keep intact all notices of the absence of any warranty; and give all 203 | recipients a copy of this License along with the Program. 204 | 205 | You may charge any price or no price for each copy that you convey, 206 | and you may offer support or warranty protection for a fee. 207 | 208 | 5. Conveying Modified Source Versions. 209 | 210 | You may convey a work based on the Program, or the modifications to 211 | produce it from the Program, in the form of source code under the 212 | terms of section 4, provided that you also meet all of these conditions: 213 | 214 | a) The work must carry prominent notices stating that you modified 215 | it, and giving a relevant date. 216 | 217 | b) The work must carry prominent notices stating that it is 218 | released under this License and any conditions added under section 219 | 7. This requirement modifies the requirement in section 4 to 220 | "keep intact all notices". 221 | 222 | c) You must license the entire work, as a whole, under this 223 | License to anyone who comes into possession of a copy. This 224 | License will therefore apply, along with any applicable section 7 225 | additional terms, to the whole of the work, and all its parts, 226 | regardless of how they are packaged. This License gives no 227 | permission to license the work in any other way, but it does not 228 | invalidate such permission if you have separately received it. 229 | 230 | d) If the work has interactive user interfaces, each must display 231 | Appropriate Legal Notices; however, if the Program has interactive 232 | interfaces that do not display Appropriate Legal Notices, your 233 | work need not make them do so. 234 | 235 | A compilation of a covered work with other separate and independent 236 | works, which are not by their nature extensions of the covered work, 237 | and which are not combined with it such as to form a larger program, 238 | in or on a volume of a storage or distribution medium, is called an 239 | "aggregate" if the compilation and its resulting copyright are not 240 | used to limit the access or legal rights of the compilation's users 241 | beyond what the individual works permit. Inclusion of a covered work 242 | in an aggregate does not cause this License to apply to the other 243 | parts of the aggregate. 244 | 245 | 6. Conveying Non-Source Forms. 246 | 247 | You may convey a covered work in object code form under the terms 248 | of sections 4 and 5, provided that you also convey the 249 | machine-readable Corresponding Source under the terms of this License, 250 | in one of these ways: 251 | 252 | a) Convey the object code in, or embodied in, a physical product 253 | (including a physical distribution medium), accompanied by the 254 | Corresponding Source fixed on a durable physical medium 255 | customarily used for software interchange. 256 | 257 | b) Convey the object code in, or embodied in, a physical product 258 | (including a physical distribution medium), accompanied by a 259 | written offer, valid for at least three years and valid for as 260 | long as you offer spare parts or customer support for that product 261 | model, to give anyone who possesses the object code either (1) a 262 | copy of the Corresponding Source for all the software in the 263 | product that is covered by this License, on a durable physical 264 | medium customarily used for software interchange, for a price no 265 | more than your reasonable cost of physically performing this 266 | conveying of source, or (2) access to copy the 267 | Corresponding Source from a network server at no charge. 268 | 269 | c) Convey individual copies of the object code with a copy of the 270 | written offer to provide the Corresponding Source. This 271 | alternative is allowed only occasionally and noncommercially, and 272 | only if you received the object code with such an offer, in accord 273 | with subsection 6b. 274 | 275 | d) Convey the object code by offering access from a designated 276 | place (gratis or for a charge), and offer equivalent access to the 277 | Corresponding Source in the same way through the same place at no 278 | further charge. You need not require recipients to copy the 279 | Corresponding Source along with the object code. If the place to 280 | copy the object code is a network server, the Corresponding Source 281 | may be on a different server (operated by you or a third party) 282 | that supports equivalent copying facilities, provided you maintain 283 | clear directions next to the object code saying where to find the 284 | Corresponding Source. Regardless of what server hosts the 285 | Corresponding Source, you remain obligated to ensure that it is 286 | available for as long as needed to satisfy these requirements. 287 | 288 | e) Convey the object code using peer-to-peer transmission, provided 289 | you inform other peers where the object code and Corresponding 290 | Source of the work are being offered to the general public at no 291 | charge under subsection 6d. 292 | 293 | A separable portion of the object code, whose source code is excluded 294 | from the Corresponding Source as a System Library, need not be 295 | included in conveying the object code work. 296 | 297 | A "User Product" is either (1) a "consumer product", which means any 298 | tangible personal property which is normally used for personal, family, 299 | or household purposes, or (2) anything designed or sold for incorporation 300 | into a dwelling. In determining whether a product is a consumer product, 301 | doubtful cases shall be resolved in favor of coverage. For a particular 302 | product received by a particular user, "normally used" refers to a 303 | typical or common use of that class of product, regardless of the status 304 | of the particular user or of the way in which the particular user 305 | actually uses, or expects or is expected to use, the product. A product 306 | is a consumer product regardless of whether the product has substantial 307 | commercial, industrial or non-consumer uses, unless such uses represent 308 | the only significant mode of use of the product. 309 | 310 | "Installation Information" for a User Product means any methods, 311 | procedures, authorization keys, or other information required to install 312 | and execute modified versions of a covered work in that User Product from 313 | a modified version of its Corresponding Source. The information must 314 | suffice to ensure that the continued functioning of the modified object 315 | code is in no case prevented or interfered with solely because 316 | modification has been made. 317 | 318 | If you convey an object code work under this section in, or with, or 319 | specifically for use in, a User Product, and the conveying occurs as 320 | part of a transaction in which the right of possession and use of the 321 | User Product is transferred to the recipient in perpetuity or for a 322 | fixed term (regardless of how the transaction is characterized), the 323 | Corresponding Source conveyed under this section must be accompanied 324 | by the Installation Information. But this requirement does not apply 325 | if neither you nor any third party retains the ability to install 326 | modified object code on the User Product (for example, the work has 327 | been installed in ROM). 328 | 329 | The requirement to provide Installation Information does not include a 330 | requirement to continue to provide support service, warranty, or updates 331 | for a work that has been modified or installed by the recipient, or for 332 | the User Product in which it has been modified or installed. Access to a 333 | network may be denied when the modification itself materially and 334 | adversely affects the operation of the network or violates the rules and 335 | protocols for communication across the network. 336 | 337 | Corresponding Source conveyed, and Installation Information provided, 338 | in accord with this section must be in a format that is publicly 339 | documented (and with an implementation available to the public in 340 | source code form), and must require no special password or key for 341 | unpacking, reading or copying. 342 | 343 | 7. Additional Terms. 344 | 345 | "Additional permissions" are terms that supplement the terms of this 346 | License by making exceptions from one or more of its conditions. 347 | Additional permissions that are applicable to the entire Program shall 348 | be treated as though they were included in this License, to the extent 349 | that they are valid under applicable law. If additional permissions 350 | apply only to part of the Program, that part may be used separately 351 | under those permissions, but the entire Program remains governed by 352 | this License without regard to the additional permissions. 353 | 354 | When you convey a copy of a covered work, you may at your option 355 | remove any additional permissions from that copy, or from any part of 356 | it. (Additional permissions may be written to require their own 357 | removal in certain cases when you modify the work.) You may place 358 | additional permissions on material, added by you to a covered work, 359 | for which you have or can give appropriate copyright permission. 360 | 361 | Notwithstanding any other provision of this License, for material you 362 | add to a covered work, you may (if authorized by the copyright holders of 363 | that material) supplement the terms of this License with terms: 364 | 365 | a) Disclaiming warranty or limiting liability differently from the 366 | terms of sections 15 and 16 of this License; or 367 | 368 | b) Requiring preservation of specified reasonable legal notices or 369 | author attributions in that material or in the Appropriate Legal 370 | Notices displayed by works containing it; or 371 | 372 | c) Prohibiting misrepresentation of the origin of that material, or 373 | requiring that modified versions of such material be marked in 374 | reasonable ways as different from the original version; or 375 | 376 | d) Limiting the use for publicity purposes of names of licensors or 377 | authors of the material; or 378 | 379 | e) Declining to grant rights under trademark law for use of some 380 | trade names, trademarks, or service marks; or 381 | 382 | f) Requiring indemnification of licensors and authors of that 383 | material by anyone who conveys the material (or modified versions of 384 | it) with contractual assumptions of liability to the recipient, for 385 | any liability that these contractual assumptions directly impose on 386 | those licensors and authors. 387 | 388 | All other non-permissive additional terms are considered "further 389 | restrictions" within the meaning of section 10. If the Program as you 390 | received it, or any part of it, contains a notice stating that it is 391 | governed by this License along with a term that is a further 392 | restriction, you may remove that term. If a license document contains 393 | a further restriction but permits relicensing or conveying under this 394 | License, you may add to a covered work material governed by the terms 395 | of that license document, provided that the further restriction does 396 | not survive such relicensing or conveying. 397 | 398 | If you add terms to a covered work in accord with this section, you 399 | must place, in the relevant source files, a statement of the 400 | additional terms that apply to those files, or a notice indicating 401 | where to find the applicable terms. 402 | 403 | Additional terms, permissive or non-permissive, may be stated in the 404 | form of a separately written license, or stated as exceptions; 405 | the above requirements apply either way. 406 | 407 | 8. Termination. 408 | 409 | You may not propagate or modify a covered work except as expressly 410 | provided under this License. Any attempt otherwise to propagate or 411 | modify it is void, and will automatically terminate your rights under 412 | this License (including any patent licenses granted under the third 413 | paragraph of section 11). 414 | 415 | However, if you cease all violation of this License, then your 416 | license from a particular copyright holder is reinstated (a) 417 | provisionally, unless and until the copyright holder explicitly and 418 | finally terminates your license, and (b) permanently, if the copyright 419 | holder fails to notify you of the violation by some reasonable means 420 | prior to 60 days after the cessation. 421 | 422 | Moreover, your license from a particular copyright holder is 423 | reinstated permanently if the copyright holder notifies you of the 424 | violation by some reasonable means, this is the first time you have 425 | received notice of violation of this License (for any work) from that 426 | copyright holder, and you cure the violation prior to 30 days after 427 | your receipt of the notice. 428 | 429 | Termination of your rights under this section does not terminate the 430 | licenses of parties who have received copies or rights from you under 431 | this License. If your rights have been terminated and not permanently 432 | reinstated, you do not qualify to receive new licenses for the same 433 | material under section 10. 434 | 435 | 9. Acceptance Not Required for Having Copies. 436 | 437 | You are not required to accept this License in order to receive or 438 | run a copy of the Program. Ancillary propagation of a covered work 439 | occurring solely as a consequence of using peer-to-peer transmission 440 | to receive a copy likewise does not require acceptance. However, 441 | nothing other than this License grants you permission to propagate or 442 | modify any covered work. These actions infringe copyright if you do 443 | not accept this License. Therefore, by modifying or propagating a 444 | covered work, you indicate your acceptance of this License to do so. 445 | 446 | 10. Automatic Licensing of Downstream Recipients. 447 | 448 | Each time you convey a covered work, the recipient automatically 449 | receives a license from the original licensors, to run, modify and 450 | propagate that work, subject to this License. You are not responsible 451 | for enforcing compliance by third parties with this License. 452 | 453 | An "entity transaction" is a transaction transferring control of an 454 | organization, or substantially all assets of one, or subdividing an 455 | organization, or merging organizations. If propagation of a covered 456 | work results from an entity transaction, each party to that 457 | transaction who receives a copy of the work also receives whatever 458 | licenses to the work the party's predecessor in interest had or could 459 | give under the previous paragraph, plus a right to possession of the 460 | Corresponding Source of the work from the predecessor in interest, if 461 | the predecessor has it or can get it with reasonable efforts. 462 | 463 | You may not impose any further restrictions on the exercise of the 464 | rights granted or affirmed under this License. For example, you may 465 | not impose a license fee, royalty, or other charge for exercise of 466 | rights granted under this License, and you may not initiate litigation 467 | (including a cross-claim or counterclaim in a lawsuit) alleging that 468 | any patent claim is infringed by making, using, selling, offering for 469 | sale, or importing the Program or any portion of it. 470 | 471 | 11. Patents. 472 | 473 | A "contributor" is a copyright holder who authorizes use under this 474 | License of the Program or a work on which the Program is based. The 475 | work thus licensed is called the contributor's "contributor version". 476 | 477 | A contributor's "essential patent claims" are all patent claims 478 | owned or controlled by the contributor, whether already acquired or 479 | hereafter acquired, that would be infringed by some manner, permitted 480 | by this License, of making, using, or selling its contributor version, 481 | but do not include claims that would be infringed only as a 482 | consequence of further modification of the contributor version. For 483 | purposes of this definition, "control" includes the right to grant 484 | patent sublicenses in a manner consistent with the requirements of 485 | this License. 486 | 487 | Each contributor grants you a non-exclusive, worldwide, royalty-free 488 | patent license under the contributor's essential patent claims, to 489 | make, use, sell, offer for sale, import and otherwise run, modify and 490 | propagate the contents of its contributor version. 491 | 492 | In the following three paragraphs, a "patent license" is any express 493 | agreement or commitment, however denominated, not to enforce a patent 494 | (such as an express permission to practice a patent or covenant not to 495 | sue for patent infringement). To "grant" such a patent license to a 496 | party means to make such an agreement or commitment not to enforce a 497 | patent against the party. 498 | 499 | If you convey a covered work, knowingly relying on a patent license, 500 | and the Corresponding Source of the work is not available for anyone 501 | to copy, free of charge and under the terms of this License, through a 502 | publicly available network server or other readily accessible means, 503 | then you must either (1) cause the Corresponding Source to be so 504 | available, or (2) arrange to deprive yourself of the benefit of the 505 | patent license for this particular work, or (3) arrange, in a manner 506 | consistent with the requirements of this License, to extend the patent 507 | license to downstream recipients. "Knowingly relying" means you have 508 | actual knowledge that, but for the patent license, your conveying the 509 | covered work in a country, or your recipient's use of the covered work 510 | in a country, would infringe one or more identifiable patents in that 511 | country that you have reason to believe are valid. 512 | 513 | If, pursuant to or in connection with a single transaction or 514 | arrangement, you convey, or propagate by procuring conveyance of, a 515 | covered work, and grant a patent license to some of the parties 516 | receiving the covered work authorizing them to use, propagate, modify 517 | or convey a specific copy of the covered work, then the patent license 518 | you grant is automatically extended to all recipients of the covered 519 | work and works based on it. 520 | 521 | A patent license is "discriminatory" if it does not include within 522 | the scope of its coverage, prohibits the exercise of, or is 523 | conditioned on the non-exercise of one or more of the rights that are 524 | specifically granted under this License. You may not convey a covered 525 | work if you are a party to an arrangement with a third party that is 526 | in the business of distributing software, under which you make payment 527 | to the third party based on the extent of your activity of conveying 528 | the work, and under which the third party grants, to any of the 529 | parties who would receive the covered work from you, a discriminatory 530 | patent license (a) in connection with copies of the covered work 531 | conveyed by you (or copies made from those copies), or (b) primarily 532 | for and in connection with specific products or compilations that 533 | contain the covered work, unless you entered into that arrangement, 534 | or that patent license was granted, prior to 28 March 2007. 535 | 536 | Nothing in this License shall be construed as excluding or limiting 537 | any implied license or other defenses to infringement that may 538 | otherwise be available to you under applicable patent law. 539 | 540 | 12. No Surrender of Others' Freedom. 541 | 542 | If conditions are imposed on you (whether by court order, agreement or 543 | otherwise) that contradict the conditions of this License, they do not 544 | excuse you from the conditions of this License. If you cannot convey a 545 | covered work so as to satisfy simultaneously your obligations under this 546 | License and any other pertinent obligations, then as a consequence you may 547 | not convey it at all. For example, if you agree to terms that obligate you 548 | to collect a royalty for further conveying from those to whom you convey 549 | the Program, the only way you could satisfy both those terms and this 550 | License would be to refrain entirely from conveying the Program. 551 | 552 | 13. Use with the GNU Affero General Public License. 553 | 554 | Notwithstanding any other provision of this License, you have 555 | permission to link or combine any covered work with a work licensed 556 | under version 3 of the GNU Affero General Public License into a single 557 | combined work, and to convey the resulting work. The terms of this 558 | License will continue to apply to the part which is the covered work, 559 | but the special requirements of the GNU Affero General Public License, 560 | section 13, concerning interaction through a network will apply to the 561 | combination as such. 562 | 563 | 14. Revised Versions of this License. 564 | 565 | The Free Software Foundation may publish revised and/or new versions of 566 | the GNU General Public License from time to time. Such new versions will 567 | be similar in spirit to the present version, but may differ in detail to 568 | address new problems or concerns. 569 | 570 | Each version is given a distinguishing version number. If the 571 | Program specifies that a certain numbered version of the GNU General 572 | Public License "or any later version" applies to it, you have the 573 | option of following the terms and conditions either of that numbered 574 | version or of any later version published by the Free Software 575 | Foundation. If the Program does not specify a version number of the 576 | GNU General Public License, you may choose any version ever published 577 | by the Free Software Foundation. 578 | 579 | If the Program specifies that a proxy can decide which future 580 | versions of the GNU General Public License can be used, that proxy's 581 | public statement of acceptance of a version permanently authorizes you 582 | to choose that version for the Program. 583 | 584 | Later license versions may give you additional or different 585 | permissions. However, no additional obligations are imposed on any 586 | author or copyright holder as a result of your choosing to follow a 587 | later version. 588 | 589 | 15. Disclaimer of Warranty. 590 | 591 | THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY 592 | APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT 593 | HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY 594 | OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, 595 | THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 596 | PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM 597 | IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF 598 | ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 599 | 600 | 16. Limitation of Liability. 601 | 602 | IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING 603 | WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS 604 | THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY 605 | GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE 606 | USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF 607 | DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD 608 | PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), 609 | EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF 610 | SUCH DAMAGES. 611 | 612 | 17. Interpretation of Sections 15 and 16. 613 | 614 | If the disclaimer of warranty and limitation of liability provided 615 | above cannot be given local legal effect according to their terms, 616 | reviewing courts shall apply local law that most closely approximates 617 | an absolute waiver of all civil liability in connection with the 618 | Program, unless a warranty or assumption of liability accompanies a 619 | copy of the Program in return for a fee. 620 | 621 | END OF TERMS AND CONDITIONS 622 | 623 | How to Apply These Terms to Your New Programs 624 | 625 | If you develop a new program, and you want it to be of the greatest 626 | possible use to the public, the best way to achieve this is to make it 627 | free software which everyone can redistribute and change under these terms. 628 | 629 | To do so, attach the following notices to the program. It is safest 630 | to attach them to the start of each source file to most effectively 631 | state the exclusion of warranty; and each file should have at least 632 | the "copyright" line and a pointer to where the full notice is found. 633 | 634 | {one line to give the program's name and a brief idea of what it does.} 635 | Copyright (C) {year} {name of author} 636 | 637 | This program is free software: you can redistribute it and/or modify 638 | it under the terms of the GNU General Public License as published by 639 | the Free Software Foundation, either version 3 of the License, or 640 | (at your option) any later version. 641 | 642 | This program is distributed in the hope that it will be useful, 643 | but WITHOUT ANY WARRANTY; without even the implied warranty of 644 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 645 | GNU General Public License for more details. 646 | 647 | You should have received a copy of the GNU General Public License 648 | along with this program. If not, see . 649 | 650 | Also add information on how to contact you by electronic and paper mail. 651 | 652 | If the program does terminal interaction, make it output a short 653 | notice like this when it starts in an interactive mode: 654 | 655 | {project} Copyright (C) {year} {fullname} 656 | This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. 657 | This is free software, and you are welcome to redistribute it 658 | under certain conditions; type `show c' for details. 659 | 660 | The hypothetical commands `show w' and `show c' should show the appropriate 661 | parts of the General Public License. Of course, your program's commands 662 | might be different; for a GUI interface, you would use an "about box". 663 | 664 | You should also get your employer (if you work as a programmer) or school, 665 | if any, to sign a "copyright disclaimer" for the program, if necessary. 666 | For more information on this, and how to apply and follow the GNU GPL, see 667 | . 668 | 669 | The GNU General Public License does not permit incorporating your program 670 | into proprietary programs. If your program is a subroutine library, you 671 | may consider it more useful to permit linking proprietary applications with 672 | the library. If this is what you want to do, use the GNU Lesser General 673 | Public License instead of this License. But first, please read 674 | . 675 | --------------------------------------------------------------------------------