├── 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 [](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.