Documentation

变量之间的操作(Operations between Variables)

我们几乎可以做任何类型的两个变量之间的进行操作,当我们不知道确切的数据类型时,我们也可以使用 Zend API 操作它们。

// First variable is string but it's a numeric string
ZVAL_STRING(&first_var, "100.10");

// Second variable is long
ZVAL_LONG(&second_var, 150);

// add_function will make the necessary conversions to produce the addition
add_function(&result, &first_var, &second_var);

连接(Concatenation)

在 PHP 中连接操作是最频繁的操作之一,我一样可以使用 Zend API 简单实现多个值的拼接:

// The following concatention using just Zend API:
//
// $month = "July"; $day = 1;
// $today = "Today is ".$month." ".$day;

ZVAL_STRING(&month, "2012");

ZVAL_LONG(&day, 1);

ZVAL_STRING(&today_is, "Today is");

concat_function(&first_part, &today_is, &month);

ZVAL_STRING(&space, " ");

concat_function(&second_part, &space, &day);

concat_function(&today, &first_part, &second_part);

Another way to do that is use sprintf, in this case, you need to be completely sure that the variables have all string types:

char *final_string;
zval final;

ZVAL_STRING(&month, "2012");

ZVAL_STRING(&day, "1");

final_string = emalloc(sizeof(char)*(Z_STRLEN_P(month)+Z_STRLEN_P(day)+12)));
sprintf(final_string, "Today is %s %s", Z_STRVAL_P(month), Z_STRVAL_P(day));

ZVAL_STRING(&final, final_string);

常用函数列表

Phalcon API 在 Zend API 的基础上提供更多的函数和弘定义(kernel/operators.h)。

函数名/宏名
phalcon_compare
phalcon_is_equal
phalcon_less
phalcon_greater
phalcon_is_scalar
phalcon_get_intval

It’s short, but if some of your variables aren’t string you will get a segmentation fault or an unexpected behavior.

To help to solve this problem, we have created a set of macros to concatenate zvals and strings:

ZVAL_STRING(&month, "2012", 1);

ZVAL_STRING(&day, "1", 1);

PHALCON_CONCAT_SVSV(&today, "Today is", &month, " ", &day);

Other examples:

PHALCON_CONCAT_VV(&result, &month, &day); //July1
PHALCON_CONCAT_VSV(&result, &month, ", ", &day); //July, 1
PHALCON_CONCAT_SVSV(&result, "Today is", &month, " ", &day); //July 1
PHALCON_CONCAT_SVSVSV(&result, "Today is", &month, " ", &day, ", ", &year); //July 1, 2012

S=String and V=Zval, just put the S and V to get the right concatenation macro. Easy, no?