Расширение PHP с C ++?

== тесты для ссылочного равенства (независимо от того, являются ли они одним и тем же объектом).

.equals() тесты для равенства значений (независимо от того, являются ли они логически «равными»).

Objects.equals () проверяет наличие null перед вызовом .equals(), поэтому вам не нужно (доступно с JDK7, также доступным в Guava ).

String.contentEquals () сравнивает содержимое String с содержимым любого CharSequence (доступно с Java 1.5).

Следовательно, если вы хотите проверить, имеет ли две строки одно и то же значение, вы, вероятно, захотите использовать Objects.equals().

// These two have the same value
new String("test").equals("test") // --> true 

// ... but they are not the same object
new String("test") == "test" // --> false 

// ... neither are these
new String("test") == new String("test") // --> false 

// ... but these are because literals are interned by 
// the compiler and thus refer to the same object
"test" == "test" // --> true 

// ... string literals are concatenated by the compiler
// and the results are interned.
"test" == "te" + "st" // --> true

// ... but you should really just call Objects.equals()
Objects.equals("test", new String("test")) // --> true
Objects.equals(null, "test") // --> false
Objects.equals(null, null) // --> true

Вы почти всегда хотите использовать Objects.equals(). В редкой ситуации, когда вы знаете, что имеете дело с интернированными строками, вы можете использовать ==.

Из JLS 3.10. 5. Строковые литералы :

Кроме того, строковый литерал всегда ссылается на тот же экземпляр класса String. Это связано с тем, что строковые литералы, или, в более общем смысле, строки, которые являются значениями константных выражений ( §15.28 ), «интернированы», чтобы обмениваться уникальными экземплярами, используя метод String.intern.

blockquote>

. Подобные примеры также можно найти в JLS 3.10.5-1 .

13
задан John Carter 27 December 2009 в 16:52
поделиться

3 ответа

Я написал плагин PHP на C ++ с помощью SWIG . Это выполнимо, но может потребоваться время, чтобы привыкнуть к циклу компиляции SWIG. Вы можете начать с документации SWIG для PHP .

Обновление
Как упоминалось в @therefromhere, я настоятельно рекомендую вам получить книгу Расширение и встраивание PHP . В сети почти нет документации (по крайней мере, ее не было в конце 2008, начале 2009 года, когда я делал свой PHP-плагин). Мне приходилось во всем полагаться на книгу. Хотя иногда поиск кода Google помогает найти образец кода.

6
ответ дан 1 December 2019 в 20:57
поделиться

PHP itself a collection of loosely related libraries. See http://devzone.zend.com/article/1021 for a tutorial how to write your own.

2
ответ дан 1 December 2019 в 20:57
поделиться

Как говорит Remus, вы можете расширить PHP на C/C++ с помощью Zend API. Связанное учебное пособие Сары Големон является хорошим началом, и книга Extending and Embedding PHP того же автора освещает эту тему более подробно.

Однако, стоит отметить, что и то, и другое (и практически все остальное, что я нашел в интернете) фокусируется на C и не охватывает некоторые тонкости, которые необходимы для работы расширений на C++.

В файле config.m4 вы должны явно ссылаться на стандартную библиотеку C++:

PHP_REQUIRE_CXX()
PHP_ADD_LIBRARY(stdc++, 1, PHP5CPP_SHARED_LIBADD)

Любая C++ библиотека компилирует проверки в конфигурационном файле . Файл m4 также потребует линковки C++ lib:

PHP_CHECK_LIBRARY($LIBNAME,$LIBSYMBOL,,
[
  AC_MSG_ERROR([lib $LIBNAME not found.])
],[
  -lstdc++ -ldl
])

EDIT - и вот как указать g++:

Последнее, и не менее важное, чтобы при сборке расширения выбрать C++, а не C-компилятор/ссылка, параметр 6 к PHP_NEW_EXTENSION() должен быть "yes". т.е.:

PHP_NEW_EXTENSION(your_extension,
                  your_extension.cpp, 
                  $ext_shared, 
                  ,
                  "-Wall -Werror -Wno-error=write-strings -Wno-sign-compare",
                  "yes")

Из руководства по системе сборки PHP PHP параметрами являются:

  1. Имя расширения
  2. Список всех исходных файлов, входящих в это расширение.
  3. (опционально) $ext_shared, значение, которое было определено configure при вызове PHP_ARG_WITH() для
  4. (опционально) "SAPI class", полезно только для расширений, требующих конкретно CGI или CLI SAPI. Во всех остальных случаях его следует оставлять пустым.
  5. (optional) Список флагов, которые должны быть добавлены в CFLAGS во время сборки расширения.
  6. (optional) Булевое значение, которое, если "да", заставит все расширение собираться с использованием $CXX, а не $CC.

Я не смог разобраться, как заставить скрипт конфигурации установить g++ в качестве компилятора/ссылки вместо gcc, так что в итоге взломал Makefile командой sed, чтобы сделать поисковую замену в моем скрипте bash build:

phpize
./configure --with-myextension
if [ "$?" == 0 ]; then
# Ugly hack to force use of g++ instead of gcc
# (otherwise we'll get linking errors at runtime)
   sed -i 's/gcc/g++/g' Makefile
   make clean
   make
fi

Предположительно есть automake команда, которая сделает этот взлом ненужным.

20
ответ дан 1 December 2019 в 20:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: