개발! 딱 깔끔하고 센스있게!

PHP 변수, 메소드, 클래스 등의 유효한 문자는 무엇입니까? 본문

개발 스크랩 메모/PHP

PHP 변수, 메소드, 클래스 등의 유효한 문자는 무엇입니까?

렉사이 2020. 12. 17. 23:54

php 이름에서 변수, 상량, 함수, 방법, 종류, 어떤 유효한 글자를 사용할 수 있습니까?

수첩에는 정규 표현식 [a -z a -z x7f --xff][a -z0 -9 x7f --*이 제한은 언제 적용합니까?

대답

[a -z a -z x7f --xff] [a -z a -z0 -9 ux7f --xff]* 정규 표현식은 이름만으로 어떤 특수 문법 원소에 직접 적용할 때만 적용된다.

몇몇 예:

$varName // <-- varName needs to satisfy the regex $foo->propertyName // <-- propertyName needs to satisfy the regex class ClassName {} // <-- ClassName needs to satisfy the regex // and can't be a reserved keyword 

주의, 이 regex 는 바이트에 따라 응용되어 있으며, 인코딩을 고려하지 않습니다.

이것은 왜 그것이 아직도 많은 이상한 유니코드 이름을 허용하는 것입니까?

그러나 레gex는 이러한 직접적인 사용 명칭만 제한한다.

각종 동적 특성을 통해 php 은 거의 임의적인 명칭을 사용할 수 있다.

일반적으로 php 제목에 어떤 글자를 포함할 수 있는지 가정해서는 안 됩니다.

대다수의 상황에서 그것들은 다만 임의의 문자열일 뿐이다.

php 에서 '인증 종류 명칭이 유효한지 여부' 같은 동작은 무의미하다.

아래에 있는 글에서 나는 예를 들어 어떻게 다른 유별로 이상한 이름을 만들 것인지 설명할 것이다.

변수

변수 이름은 임의 문자열:

${''} = 'foo'; echo ${''}; // foo ${"\0"} = 'bar'; echo ${"\0"}; // bar 

상수

전역 상수도 임의 문자열:

define('', 'foo'); echo constant(''); // foo define("\0", 'bar'); echo constant("\0"); // bar 

동태는 내가 알고 있는 유형의 상량을 정의할 수 없어 이 상량은 임의할 수 없다.

이상한 종류의 상량을 만드는 유일한 방법은 확장을 통해 코드를 확장하는 것 같다.

속성

속성은 빈 문자열일 수 없고 nul 바이트로 시작하면 안 되지만 그 외에는 임의적인 것이다.

$obj = new stdClass; $obj->{''} = 'foo'; // Fatal error: Cannot access empty property $obj->{"\0"} = 'foo'; // Fatal error: Cannot access property started with '\0' $obj->{'*'} = 'foo'; echo $obj->{'*'}; // foo 

방법

방법은 임의로 magic 을 호출해서 처리할 수 있습니다:

class Test { public function __call($method, $args) { echo "Called method \"$method\""; } } $obj = new Test; $obj->{''}(); // Called method "" $obj->{"\0"}(); // Called method "\0" 

학급

종류별 이름으로 임의의 이름을 만들 수 있지만, 빈 문자열 제외:

class Test {} class_alias('Test', ''); $className = ''; $obj = new $className; // Fatal error: Class '' not found class_alias('Test', "\0"); $className = "\0"; $obj = new $className; // Works! 

기능

나는 userland 에서 임의의 함수 이름을 만드는 방법을 몰랐지만 내부 코드가'수상하다'라는 이름을 생성할 수 있었다.

var_dump(create_function('','')); // string(9) "\0lambda_1" 
Comments