찾다
백엔드 개발PHP 튜토리얼php是如何找到要实例的对象的

比如我有个test对象,首先先实例对象,然后对象在实例化的后面,这个时候为什么还会找的到对象?

<code>$test = new Test();
echo $test->run();

class Test{
    public function run(){
        return 'run---';
    }
}
</code>

上面代码是怎么运行的,php怎么找的到test对象的?

回复内容:

比如我有个test对象,首先先实例对象,然后对象在实例化的后面,这个时候为什么还会找的到对象?

<code>$test = new Test();
echo $test->run();

class Test{
    public function run(){
        return 'run---';
    }
}
</code>

上面代码是怎么运行的,php怎么找的到test对象的?

你应该明白任何解释器都不是直接解释源代码的(虽然你可以这么做),而是经过"预处理",之后,在执行这个预处理的结果.虽然说是解释器
比如你写

<code>echo "Hello world";
exit;
!#$%^&*()error</code>

按照你理解的逻辑,可能php的解释器是现在才开始扫描这个源码,它会打印出Hello world的,但却给你一个PHP Parse error: syntax error, 的异常.
奇怪,可见,源代码在执行前经过了一次检查,这些检查包括但不限于语法检测,php的源码是经过处理的,你所定义的Test已经存在了.也就是说,所谓的解释器,基本上都存在"伪编译"的过程,所谓动态是指,你每一次请求都需要经过这样的处理,对Java而言,这些工作需要你手动指定,编译OK的class,继续交给虚拟机执行.

下面是在鸟哥的博客里面找到的执行流程简化,解释器其实是在解释Opcode(这也是APC存在的基础):

  1. 词法分析, 去掉注释, 空白, 得到TOKEN

  2. 语法分析, 在这个过程中生成Opcode array (op_array)

  3. 解释执行, 执行op_array, 一条一条的解释执行Opline(SWITCH, CALL, GOTO)

PHP 解释器是个 C 程序。
它是解释型语言,所以无需编译,但这个编译指的是『编译成二进制文件』。
但是从脚本到结果,中间还是有一系列过程的。

语言本身只是为了更符合人的习惯,PHP 解释器最终执行的是 opcode。

从从 php 脚本到 opcodes 的的过程在 PHP5 中是:

Lexing:词法扫描分析,将源文件转换成 token 流;
Parsing:语法分析,在此阶段生成 op arrays。

PHP7 中在语法分析阶段不再直接生成 op arrays,而是先生成 AST,所以过程多了一步:

Lexing:词法扫描分析,将源文件转换成 token 流;
Parsing:语法分析,从 token 流生成抽象语法树;
Compilation:从抽象语法树生成 op arrays。

上面的 lexing,也就是词法分析,PHP 用的是 re2c,parsing 也就是语法分析,PHP 用的是bison。
lexing 做一些符号替换,状态记录的东西。
parsing 会去扫描语法,然后调用相应的处理函数,比如 zend_do_begin_class_declaration 之类的函数。当然这是 PHP5,PHP7 它会先去调 zend_ast_create 之类的。

接下来 PHP5 中 parsing 调的相应的处理函数就会将语句转换成 opcode,将变量存在内存中,函数名、类名存在符号表中。
PHP7 中会有 compile 相关的函数去分析抽象语法树,然后得到和上面相同的结果。

这样你的变量、类、函数都在内存中准备就绪了,你的赋值语句、函数调用语句都已经变成了顺序排列的一条一条的 opcode array了。

然后就是执行了。会有一个 excute 相关的函数来一条一条的执行 opcode,得到的就是你要的结果。

所以你的类虽然写在下面,但是完全可以被找到的。

上面说的这些过程,对应的 PHP 解释器中的文件分别是:

zend_language_scanner.l
zend_language_parser.y
zend_ast.c (PHP7)
zend_compile.c
zend_excute.c

如果有 C 语言的底子,尝试从另外一个层面去了解会更简单。

php是解释型语言, 不用像编译型语言(c)那样提前声明函数定义。

运行之前电脑会把整个php代码加载到内存中吧。然后再去查找调用。。
我是才学一个月的小白。。不知道对不对

代码会放在内存中的代码区,程序运行的时候调用,所以在你代码中的顺序没有关系,但建议便于阅读,实例放在前面。

别高兴得太早,如果它继承另一个类(include),就要放在下面了,php是个奇葩

我觉得大家解释的都仅仅是原理,没有解释道这题的根本,这道问题的意思是问为什么把类定义到调用类的后面也可以,按照常理来说是类定义在要调用的前面才能查找得到。
我来解释一下这个问题吧,首先,定义了类,不调用,是没有意义的,要调用,就必须要实例化,上面提到的opcode执行机制,这个是对的,那么我说的原因基于这个,也就是说php在执行的时候进行预编译,那么编译的时候把执行的数据放到内存,其存放方式和我们写代码的时候是不一样的,php把每种类型的数据放到不同的位置,比如把类放到堆,也就是说,你这个类,不管定义在前面和后面,执行程序的时候,相当于是忽略你的定义的(因为在预编译阶段被移动到了堆),那么只有在执行到实例化具体的类的时候,才会去堆里查找有没有定义这个类,定义了按照堆里定义的类数据进行实例化,然后执行。

성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
절대 세션 타임 아웃의 차이점은 무엇입니까?절대 세션 타임 아웃의 차이점은 무엇입니까?May 03, 2025 am 12:21 AM

절대 세션 시간 초과는 세션 생성시 시작되며, 유휴 세션 시간 초과는 사용자가 작동하지 않아 시작합니다. 절대 세션 타임 아웃은 금융 응용 프로그램과 같은 세션 수명주기의 엄격한 제어가 필요한 시나리오에 적합합니다. 유휴 세션 타임 아웃은 사용자가 소셜 미디어와 같이 오랫동안 세션을 활성화하려는 응용 프로그램에 적합합니다.

세션이 서버에서 작동하지 않으면 어떤 조치를 취 하시겠습니까?세션이 서버에서 작동하지 않으면 어떤 조치를 취 하시겠습니까?May 03, 2025 am 12:19 AM

서버 세션 고장은 다음 단계를 따라 해결할 수 있습니다. 1. 서버 구성을 확인하여 세션이 올바르게 설정되었는지 확인하십시오. 2. 클라이언트 쿠키를 확인하고 브라우저가 지원하는지 확인하고 올바르게 보내십시오. 3. Redis와 같은 세션 스토리지 서비스가 정상적으로 작동하는지 확인하십시오. 4. 올바른 세션 로직을 보장하기 위해 응용 프로그램 코드를 검토하십시오. 이러한 단계를 통해 대화 문제를 효과적으로 진단하고 수리 할 수 ​​있으며 사용자 경험을 향상시킬 수 있습니다.

session_start () 함수의 중요성은 무엇입니까?session_start () 함수의 중요성은 무엇입니까?May 03, 2025 am 12:18 AM

session_start () iscrucialinphpformanagingUsersessions.1) itiniteSanewsessionifnoneexists, 2) ResumesAnxistessions, and3) setSasessionCookieForContInuityAcrosrequests, enablingplicationsirecationSerauthenticationAndpersonalizestContent.

세션 쿠키를 위해 httponly 플래그를 설정하는 것이 중요합니까?세션 쿠키를 위해 httponly 플래그를 설정하는 것이 중요합니까?May 03, 2025 am 12:10 AM

XSS 공격을 효과적으로 방지하고 사용자 세션 정보를 보호 할 수 있기 때문에 httponly 플래그를 설정하는 것은 세션 쿠키에 중요합니다. 구체적으로, 1) httponly 플래그는 JavaScript가 쿠키에 액세스하는 것을 방지합니다. 2) PHP 및 Flask에서 SetCookies 및 Make_response를 통해 깃발을 설정할 수 있습니다. 3) 모든 공격으로부터 방지 할 수는 없지만 전체 보안 정책의 일부가되어야합니다.

웹 개발에서 PHP 세션은 어떤 문제를 해결합니까?웹 개발에서 PHP 세션은 어떤 문제를 해결합니까?May 03, 2025 am 12:02 AM

phpssessionssolvetheproblemofmainingstateacrossmultiplehtttprequestsbystoringdataontheserversociatingititwithauniquessessionid.1) theStoredAserver-side, 일반적으로, 일반적으로 and insessionsecietoretoretrievedata.2) sessionsenhances

PHP 세션에 어떤 데이터를 저장할 수 있습니까?PHP 세션에 어떤 데이터를 저장할 수 있습니까?May 02, 2025 am 12:17 AM

phpsessionscanstorestrings, 숫자, 배열 및 객체 1.Strings : TextDatalikeUsernames.2.numbers : integorfloatsforcounters.3.arrays : listslikeshoppingcarts.4.objects : complexStructuresThatareserialized.

PHP 세션을 어떻게 시작합니까?PHP 세션을 어떻게 시작합니까?May 02, 2025 am 12:16 AM

tostartAphPessession, us

세션 재생이란 무엇이며 보안을 어떻게 개선합니까?세션 재생이란 무엇이며 보안을 어떻게 개선합니까?May 02, 2025 am 12:15 AM

세션 재생은 세션 고정 공격의 경우 사용자가 민감한 작업을 수행 할 때 새 세션 ID를 생성하고 이전 ID를 무효화하는 것을 말합니다. 구현 단계에는 다음이 포함됩니다. 1. 민감한 작업 감지, 2. 새 세션 ID 생성, 3. 오래된 세션 ID 파괴, 4. 사용자 측 세션 정보 업데이트.

See all articles

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

Video Face Swap

Video Face Swap

완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

뜨거운 도구

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

맨티스BT

맨티스BT

Mantis는 제품 결함 추적을 돕기 위해 설계된 배포하기 쉬운 웹 기반 결함 추적 도구입니다. PHP, MySQL 및 웹 서버가 필요합니다. 데모 및 호스팅 서비스를 확인해 보세요.

MinGW - Windows용 미니멀리스트 GNU

MinGW - Windows용 미니멀리스트 GNU

이 프로젝트는 osdn.net/projects/mingw로 마이그레이션되는 중입니다. 계속해서 그곳에서 우리를 팔로우할 수 있습니다. MinGW: GCC(GNU Compiler Collection)의 기본 Windows 포트로, 기본 Windows 애플리케이션을 구축하기 위한 무료 배포 가능 가져오기 라이브러리 및 헤더 파일로 C99 기능을 지원하는 MSVC 런타임에 대한 확장이 포함되어 있습니다. 모든 MinGW 소프트웨어는 64비트 Windows 플랫폼에서 실행될 수 있습니다.

mPDF

mPDF

mPDF는 UTF-8로 인코딩된 HTML에서 PDF 파일을 생성할 수 있는 PHP 라이브러리입니다. 원저자인 Ian Back은 자신의 웹 사이트에서 "즉시" PDF 파일을 출력하고 다양한 언어를 처리하기 위해 mPDF를 작성했습니다. HTML2FPDF와 같은 원본 스크립트보다 유니코드 글꼴을 사용할 때 속도가 느리고 더 큰 파일을 생성하지만 CSS 스타일 등을 지원하고 많은 개선 사항이 있습니다. RTL(아랍어, 히브리어), CJK(중국어, 일본어, 한국어)를 포함한 거의 모든 언어를 지원합니다. 중첩된 블록 수준 요소(예: P, DIV)를 지원합니다.

Atom Editor Mac 버전 다운로드

Atom Editor Mac 버전 다운로드

가장 인기 있는 오픈 소스 편집기