==
тесты для ссылочного равенства (независимо от того, являются ли они одним и тем же объектом).
.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. Строковые литералы :
Кроме того, строковый литерал всегда ссылается на тот же экземпляр класса
blockquote>String
. Это связано с тем, что строковые литералы, или, в более общем смысле, строки, которые являются значениями константных выражений ( §15.28 ), «интернированы», чтобы обмениваться уникальными экземплярами, используя методString.intern
.. Подобные примеры также можно найти в JLS 3.10.5-1 .
Я написал плагин PHP на C ++ с помощью SWIG . Это выполнимо, но может потребоваться время, чтобы привыкнуть к циклу компиляции SWIG. Вы можете начать с документации SWIG для PHP .
Обновление
Как упоминалось в @therefromhere, я настоятельно рекомендую вам получить книгу Расширение и встраивание PHP . В сети почти нет документации (по крайней мере, ее не было в конце 2008, начале 2009 года, когда я делал свой PHP-плагин). Мне приходилось во всем полагаться на книгу. Хотя иногда поиск кода Google помогает найти образец кода.
PHP itself a collection of loosely related libraries. See http://devzone.zend.com/article/1021 for a tutorial how to write your own.
Как говорит 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
])
Последнее, и не менее важное, чтобы при сборке расширения выбрать 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 параметрами являются:
$ext_shared
, значение, которое было определено configure при вызове PHP_ARG_WITH() для
Я не смог разобраться, как заставить скрипт конфигурации установить 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 команда, которая сделает этот взлом ненужным.