React[001]:初体验
小样儿挺别致呀,写起来的感觉
安装nodejs,npm,npx
vscode 插件
1 | ES7 React/Redux/GraphQL/React-Native snippets |
如果网差,可能安装失败
1 | npx create-react-app simple-react-web |
1 | npm i classnames -S |
index.js
1 | import React from 'react' |
挺别致
安装nodejs,npm,npx
vscode 插件
1 | ES7 React/Redux/GraphQL/React-Native snippets |
如果网差,可能安装失败
1 | npx create-react-app simple-react-web |
1 | npm i classnames -S |
index.js
1 | import React from 'react' |
挺别致
1 | enum Color {Red, Green, Blue} |
1 | var Color; |
1 | // 声明 |
由于php中直接声明的变量obj是obj,array是array。所以需要先创建一个enum类实现array接口这样就可以实现与上述代码相同的赋值行为。代码如下
1 | <?php |
终端输出
1 | object(enum)#2 (4) { |
re2c 测试运行示例
1 | $ ./integer 1024 |
Re2c 是一个免费的开源词典生成器,适用于 C 和C++。其主要目标是生成与仔细优化的手写代码的速度相匹配或超过速度的快速词典。Re2c 使用有限状态机的直接编码,而不是表驱动的方法,并优化生成的代码。re2c 的另一个显著功能是异常灵活的用户界面:re2c 将接口代码的定义留给用户,而不是假设一个固定的程序模板。这为用户提供了为特定环境和输入模型自定义 lexer 的自由。Re2c 支持使用 POSIX 或最左侧贪婪语义的快速和轻量级子匹配提取。Re2c被许多其他项目使用(如php),旨在完全向后兼容。另一方面,它是一个研究项目和一个游乐场,在正式语法和自动机领域开发新的算法
起因:之前曾编译了一份php,在目录xxx.xxx.xx/下,由于文件夹名字冗余信息过度,该改名为xxx.xx/改名后运行执行php发现扩展没有被加载,执行php --ini 发现php.ini的加载路径为原来安装时的绝对路径并且为固定值
php编译安装默认设置php.ini的路径为PREFIX/lib
即安装路径下的lib目录,也可以使用--with-config-file-path
参数指定一个新的路径,这里测试一个指定的相对路径
1 | ./configure --prefix=/mnt/d/WorkSpace/hzj/php-src-p/php7.4.1output --with-config-file-path="../" |
编译完成后在/mnt/d/WorkSpace/hzj/php-src-p/php7.4.1output
中创建一个php.ini,看是否可以加载
当目录为/mnt/d/WorkSpace/hzj/php-src-p/php7.4.1output/bin/php
时,可以加载php.ini,其他目录则不可,所以说明两点,第一点是编写的相对路径生效了,第二点,生效的相对路径是对执行目录而言,而不是对执行文件而言。
1 | h@Happy:/mnt/d/WorkSpace/hzj/php-src-p/php7.4.1output/bin$ ./php --ini |
这里开始查询源码文件夹下的的代码,首先搜索关键字符串Configuration File (php.ini) Path
查找到sapi\cli\php_cli.c
文件中 1
2
3
4
5zend_printf("Configuration File (php.ini) Path: %s\n", PHP_CONFIG_FILE_PATH);
zend_printf("Loaded Configuration File: %s\n", php_ini_opened_path ? php_ini_opened_path : "(none)");
zend_printf("Scan for additional .ini files in: %s\n", php_ini_scanned_path ? php_ini_scanned_path : "(none)");
zend_printf("Additional .ini files parsed: %s\n", php_ini_scanned_files ? php_ini_scanned_files : "(none)");
break;
查找变量PHP_CONFIG_FILE_PATH
在main\build-defs.h
1
2
3
4#define PHP_SYSCONFDIR "/mnt/d/WorkSpace/hzj/php-src-p/php7.4.1output/etc"
#define PHP_LOCALSTATEDIR "/mnt/d/WorkSpace/hzj/php-src-p/php7.4.1output/var"
#define PHP_CONFIG_FILE_PATH "../"
#define PHP_CONFIG_FILE_SCAN_DIR ""
可见该文件为./configure
生成的的相关宏,由于实及加载为php.ini
,所以查询变量php_ini_opened_path
php_cli.c
中 1
2
3
4
5
PHPAPI extern char *php_ini_opened_path;
PHPAPI extern char *php_ini_scanned_path;
PHPAPI extern char *php_ini_scanned_files;
php_ini.c
1
PHPAPI char *php_ini_opened_path=NULL;
php_ini.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20if (fp) {
zend_file_handle fh;
zend_stream_init_fp(&fh, fp, filename);
RESET_ACTIVE_INI_HASH();
zend_parse_ini_file(&fh, 1, ZEND_INI_SCANNER_NORMAL, (zend_ini_parser_cb_t) php_ini_parser_cb, &configuration_hash);
{
zval tmp;
ZVAL_NEW_STR(&tmp, zend_string_init(fh.filename, strlen(fh.filename), 1));
zend_hash_str_update(&configuration_hash, "cfg_file_path", sizeof("cfg_file_path")-1, &tmp);
if (opened_path) {
zend_string_release_ex(opened_path, 0);
} else {
efree((char *)fh.filename);
}
php_ini_opened_path = zend_strndup(Z_STRVAL(tmp), Z_STRLEN(tmp));
}
}
此时已将追到了赋值所在
网上找了了一份获取文件执行路径的代码 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21#include <stdio.h>
#include<string.h>
#include<unistd.h>
int main()
{
char szBuf[128];
char szPath[128];
memset(szBuf, 0x00, sizeof( szBuf));
memset( szPath, 0x00, sizeof(szPath));
getcwd(szBuf, sizeof(szBuf)-1);
printf("buf:%s\n", szBuf);
int ret = readlink("/proc/self/exe", szPath, sizeof(szPath)-1 );
printf("ret:%d\n", ret);
printf("path:%s\n", szPath);
return 0;
}
下一步尝试替换此处,使的php可以加载安装目录下相对路径中的php.ini