## ShirDon-廖显东 / php-goGoMIT

Explore and code with more than 2 million developers，Free private repositories ！：）
• Go 47.8%
• C 43.4%
• Makefile 5.3%
• Dockerfile 3.2%
• C++ 0.3%
githubvip authored commit
Notice: Creating folder will generate an empty file .keep, because not support in Git

# PHP bindings for Go

## 编译

Note: Building against PHP 5.x requires that the php5 tag is provided, i.e.:

go get -tags php5 gitee.com/shirdonl/php-go

This is due to the fact that PHP 7.x is the default build target.

## Status

Executing PHP [script files] as well as [inline strings]is supported and stable.

[Binding Go values] as PHP variables is allowed for most base types, and PHP values returned from eval'd strings can be converted and used in Go contexts as interface{} values.

It is possible to [attach Go method receivers] as PHP classes, with full support for calling expored methods, as well as getting and setting embedded fields (for struct-type method receivers).

### Caveats

Be aware that, by default, PHP is not designed to be used in multithreaded environments (which severely restricts the use of these bindings with Goroutines) if not built with ZTS support. However, ZTS support has seen major refactoring between PHP 5 and PHP 7, and as such is currently unsupported by this package.

Currently, it is recommended to either sync use of seperate Contexts between Goroutines, or share a single Context among all running Goroutines.

Currently, the package lacks in several respects:

• ZTS/multi-threading support. This basically means using Go-PHP in Goroutines is severely limited.
• Documentation and examples, both package-level and external.
• Performance. There's no reason to believe Go-PHP suffers from any serious performance issues in particular, but adding benchmarks, especially compared against vanilla PHP, might help.

These items will be tackled in order of significance (which may not be the order shown above).

## Usage

### Basic

Executing a script is simple:

package main

import (
php "gitee.com/shirdonl/php-go"
"os"
)

func main() {
engine, _ := php.New()

context, _ := engine.NewContext()
context.Output = os.Stdout

context.Exec("index.php")
engine.Destroy()
}

The above will execute script file index.php located in the current folder and will write any output to the io.Writer assigned to Context.Output (in this case, the standard output).

### Binding and returning variables

The following example demonstrates binding a Go variable to the running PHP context, and returning a PHP variable for use in Go:

package main

import (
"fmt"
php "gitee.com/shirdonl/php-go"
)

func main() {
engine, _ := php.New()
context, _ := engine.NewContext()

var str string = "Hello"
context.Bind("var", str)

val, _ := context.Eval("return $var.' World';") fmt.Printf("%s", val.Interface()) // Prints 'Hello World' back to the user. engine.Destroy() } A string value "Hello" is attached using Context.Bind under a name var (available in PHP as $var). A script is executed inline using Context.Eval, combinding the attached value with a PHP string and returning it to the user.

Finally, the value is returned as an interface{} using Value.Interface() (one could also use Value.String(), though the both are equivalent in this case).