Советы: вышла новая книга автора «Практический бой алгоритмов на языке Go с нуля», покупайте на JD.com и Dangdang!
Этот пакет реализует поддержку выполнения PHP-скриптов, экспорта переменных Go для использования в контексте PHP, добавления приёмников методов Go в качестве классов PHP и возврата переменных PHP для использования в контексте Go.
Поддерживает PHP 5.x и PHP 7.x
Для сборки этого пакета необходимо установить PHP как библиотеку. Для большинства Linux-систем это обычно можно найти в пакете «php-embed» или его вариантах. Убедитесь, что библиотека PHP доступна, затем вы можете использовать «go build» для компиляции привязок и «go get».
Примечание: сборка с использованием PHP 5.x требует указания тега php5
, например:
go get -tags php5 gitee.com/shirdonl/php-go
Это связано с тем, что PHP 7.x является целевой сборкой по умолчанию.
Выполнение PHP [файлов сценариев] и [встроенных строк] поддерживается и стабильно.
[Привязка значений Go] как переменных PHP разрешена для большинства базовых типов, а значения PHP, возвращаемые из eval'd строк, могут быть преобразованы и использованы в контекстах Go как значения interface{}
.
Можно [прикрепить приёмники методов Go] в качестве классов PHP с полной поддержкой вызова экспортированных методов, а также получения и установки встроенных полей (для приёмников типа struct
).
Обратите внимание, что по умолчанию PHP не предназначен для использования в многопоточных средах (что серьёзно ограничивает использование этих привязок с Goroutines), если он не собран с поддержкой ZTS. Однако поддержка ZTS претерпела значительные изменения между PHP 5 и PHP 7 и в настоящее время не поддерживается этим пакетом.
В настоящее время рекомендуется либо синхронизировать использование отдельных контекстов между Goroutines, либо совместно использовать один контекст среди всех запущенных Goroutines.
В настоящий момент пакет имеет несколько недостатков:
Эти пункты будут решены в порядке значимости (который может не соответствовать порядку, указанному выше).
Выполнить скрипт просто:
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()
}
Приведённый выше код выполнит файл сценария index.php
, расположенный в текущей папке, и запишет любой вывод в io.Writer
, назначенный Context.Output
(в данном случае стандартный вывод).
Следующий пример демонстрирует привязку переменной Go к текущему контексту PHP и возврат переменной PHP для использования в 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())
// Выводит 'Hello World' пользователю.
engine.Destroy()
}
Строковое значение «Hello» прикрепляется с помощью Context.Bind
под именем var
(доступно в PHP как $var
). Скрипт выполняется встроенным образом с помощью Context.Eval
, объединяя прикреплённое значение со строкой PHP и возвращая его пользователю.
Наконец, значение возвращается как interface{}
с помощью Value.Interface()
(можно также использовать Value.String()
, хотя в этом случае они эквивалентны).
Весь код в этом репозитории подпадает под условия лицензии MIT, полный текст которой можно найти в файле LICENSE. [Context.Exec]:
[Context.Eval]:
[NewValue]:
[NewReceiver]:
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.