PHP에서 is_callable() 및 method_exists() 함수 살펴보기
많은 제품 응용 프로그램에서 객체에 메소드가 존재하는지 확인하는 데 사용되는 다음과 같은 사용법을 자주 볼 수 있습니다.
<?php if (method_exists($object, 'SomeMethod')) { $object->SomeMethod($this, TRUE); } ?>
이 코드의 목적은 비교적 이해하기 쉽습니다. $object라는 객체가 있는데, SomeMethod라는 메소드가 있는지 알고 싶습니다.
이 코드는 정확해 보이며 대부분의 경우 정상적으로 실행됩니다. 그런데 이 $object 객체의 메소드가 현재 실행 중인 환경에 보이지 않는 경우에도 프로그램이 정상적으로 실행될 수 있을까요? 이 함수 이름 메서드가 존재하는 것처럼 우리가 제공하는 클래스나 객체에 우리가 기대하는 메서드가 있는지 확인하고, 있으면 TRUE를 반환하고, 없으면 FALSE를 반환합니다. 따라서 비공개 또는 보호된 메서드를 결정하면 올바른 반환을 얻을 수 있지만 실행하면 "치명적인 오류" 오류 경고가 표시됩니다.
위 코드의 실제 의도는 다음과 같이 이해해야 합니다. 제공된 클래스 또는 개체에 대해 현재 범위에서 SomeMethod 메서드를 호출할 수 있습니까? 그리고 이것이 바로 is_callable()
함수의 목적입니다. is_callable()
함수는 함수 이름이나 메서드 이름과 개체가 포함된 배열을 지정할 수 있는 콜백 매개변수를 받습니다. 현재 범위에서 실행될 수 있으면 TRUE를 반환합니다. is_callable()
函数存在的目的。is_callable()
函数接收一个回调参数,可以指定一个函数名称或者一个包含方法名和对象的数组,如果在当前作用域中可以执行,就返回TRUE。
<?php if (is_callable(array($object, 'SomeMethod'))) { $object->SomeMethod($this, TRUE); } ?>
下面来举个例子来说明两者的区别
<?phpclass Foo { public function PublicMethod(){} private function PrivateMethod(){} public static function PublicStaticMethod(){} private static function PrivateStaticMethod(){} } $foo = new Foo();$callbacks = array( array($foo, 'PublicMethod'), array($foo, 'PrivateMethod'), array($foo, 'PublicStaticMethod'), array($foo, 'PrivateStaticMethod'), array('Foo', 'PublicMethod'), array('Foo', 'PrivateMethod'), array('Foo', 'PublicStaticMethod'), array('Foo', 'PrivateStaticMethod'), ); foreach ($callbacks as $callback){ var_dump($callback); var_dump(method_exists($callback[0], $callback[1])); var_dump(is_callable($callback)); echo str_repeat('-', 10); echo '<br />'; }
执行上面的脚本后,我们会清晰地看到两个函数间的差别。
is_callable()
还有其他的用法,例如,不检查所提供的类或方法,只检查函数或方法的语法是否正确。像method_exists()
一样,is_callable()
可以触发类的自动加载。
如果一个对象存在魔术方法__call
,在进行方法判断时method_exists()
会返回FALSE,而is_callable()
会返回TRUE。
<?phpclass MethodTest { public function __call($name, $arguments){ echo 'Calling object method ' . $name . ' ' .implode(', ', $arguments); echo '<br />'; } }$obj = new MethodTest();$obj->runtest('in object context'); var_dump(method_exists($obj,'runtest')); var_dump(is_callable(array($obj,'runtest'))); echo '<br />';
运行结果
Calling object method runtest in object context
bool(false) bool(true)
在很多产品应用中,我们经常能够看到以下这种用法,它用来检查一个对象里的方法是否存在。
<?phpif (method_exists($object, 'SomeMethod')) { $object->SomeMethod($this, TRUE); }?>
这段代码的目的比较容易理解,有一个对象为$object,我们想知道它是否有一个方法为SomeMethod,如果有,就调用此方法。
这个代码看起来正确,而且在大部分的时候运行也会正常。但是如果这个$object对象的方法对于当前的运行环境是不可见的,程序还能正常运行吗?正如这个函数名方法存在一样,只是对我们提供的类或对象检查是否有我们所期望的方法,如果有,就返回TRUE,如果没有,就返回FALSE,这里并没有考虑可见性的问题。所以,当你恰好判断一个私有或者受保护的方法时,你能够得到一个正确的返回,但是执行的时候,会得到一个“Fatal Error”错误警告。
上面这段代码的真正意图应该理解为:对于提供的类或者对象,我们能否在当前的作用域中调用它的SomeMethod方法。而这正是is_callable()
函数存在的目的。is_callable()
函数接收一个回调参数,可以指定一个函数名称或者一个包含方法名和对象的数组,如果在当前作用域中可以执行,就返回TRUE。
<?php if (is_callable(array($object, 'SomeMethod'))) { $object->SomeMethod($this, TRUE); } ?>
下面来举个例子来说明两者的区别
<?php class Foo { public function PublicMethod(){} private function PrivateMethod(){} public static function PublicStaticMethod(){} private static function PrivateStaticMethod(){} } $foo = new Foo();$callbacks = array( array($foo, 'PublicMethod'), array($foo, 'PrivateMethod'), array($foo, 'PublicStaticMethod'), array($foo, 'PrivateStaticMethod'), array('Foo', 'PublicMethod'), array('Foo', 'PrivateMethod'), array('Foo', 'PublicStaticMethod'), array('Foo', 'PrivateStaticMethod'), ); foreach ($callbacks as $callback){ var_dump($callback); var_dump(method_exists($callback[0], $callback[1])); var_dump(is_callable($callback)); echo str_repeat('-', 10); echo '<br />'; }
执行上面的脚本后,我们会清晰地看到两个函数间的差别。
is_callable()
还有其他的用法,例如,不检查所提供的类或方法,只检查函数或方法的语法是否正确。像method_exists()
一样,is_callable()
可以触发类的自动加载。
如果一个对象存在魔术方法__call
,在进行方法判断时method_exists()
会返回FALSE,而is_callable()
<?phpclass MethodTest { public function __call($name, $arguments){ echo 'Calling object method ' . $name . ' ' .implode(', ', $arguments); echo '<br />'; } } $obj = new MethodTest();$obj->runtest('in object context'); var_dump(method_exists($obj,'runtest')); var_dump(is_callable(array($obj,'runtest'))); echo '<br />';
rrreee
위 스크립트를 실행하면 두 함수의 차이점을 명확하게 볼 수 있습니다.is_callable()
에는 다른 용도도 있습니다. 예를 들어 제공된 클래스나 메서드를 확인하지 않고 함수나 메서드의 구문이 올바른지 확인만 합니다. method_exists()
와 마찬가지로 is_callable()
은 클래스 자동 로드를 트리거할 수 있습니다.
객체에 매직 메소드 __call
이 있는 경우 method_exists()
는 메소드 판단 시 FALSE를 반환하고 is_callable()
은 TRUE를 반환합니다. . rrreee
is_callable()
함수의 목적입니다. is_callable()
함수는 함수 이름이나 메서드 이름과 개체가 포함된 배열을 지정할 수 있는 콜백 매개변수를 받습니다. 현재 범위에서 실행될 수 있으면 TRUE를 반환합니다. 🎜rrreee🎜두 함수의 차이점을 설명하기 위해 예를 들어보겠습니다.🎜rrreee🎜위 스크립트를 실행하면 두 함수의 차이점을 명확하게 볼 수 있습니다. 🎜🎜is_callable()
에는 다른 용도도 있습니다. 예를 들어 제공된 클래스나 메서드를 확인하지 않고 함수나 메서드의 구문이 올바른지 확인만 합니다. method_exists()
와 마찬가지로 is_callable()
은 클래스 자동 로드를 트리거할 수 있습니다. 🎜🎜객체에 매직 메소드 __call
이 있는 경우 method_exists()
는 메소드 판단 시 FALSE를 반환하고 is_callable()
은 TRUE를 반환합니다. . 🎜rrreee🎜실행 결과🎜🎜객체 컨텍스트에서 객체 메서드 runtest 호출 🎜bool(false) bool(true)🎜🎜🎜🎜위 내용은 PHP에서 is_callable() 및 method_exists() 함수 살펴보기의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

핫 AI 도구

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

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

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

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

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

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

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











웹 애플리케이션 개발을 위해 PHP를 사용할 때 데이터베이스를 사용해야 하는 경우가 많습니다. 데이터베이스를 사용할 때 오류 메시지는 매우 일반적입니다. 그 중 PHPFatalerror: Calltoamemberfunctionfetch()는 PDO를 사용하여 데이터베이스를 쿼리할 때 발생하는 비교적 일반적인 오류입니다. 그렇다면 이 오류가 발생하는 원인과 해결 방법은 무엇입니까? 이 기사에서는 이에 대해 자세히 설명합니다. 1. 오류의 원인

1. 기본 기능 1. 낙관적 잠금으로 시작하여 잠금 충돌이 빈번하면 비관적 잠금으로 변환됩니다. 2. 경량 잠금 구현으로 시작하여 잠금이 오랫동안 유지되면 잠금이 해제됩니다. 3. 경량 잠금을 구현할 때 가장 많이 사용되는 스핀 잠금 전략 4. 불공정 잠금 5. 재진입 잠금 6. 읽기-쓰기 잠금이 아님 2. JVM 잠금 프로세스를 동기화합니다. 잠금은 잠금 없음, 편향된 잠금, 경량 잠금 및 중량 잠금 상태로 구분됩니다. 상황에 따라 순차적으로 업그레이드될 예정입니다. 편향된 자물쇠는 남자 주인공이 자물쇠이고 여자 주인공이 실이라고 가정합니다. 이 스레드만 이 자물쇠를 사용하면 남자 주인공과 여자 주인공은 결혼 증명서를 받지 못해도 영원히 행복하게 살 수 있습니다. -비용 운영) 그러나 여성 조연이 나타납니다.

C#에서 File.Exists 함수를 사용하여 파일이 있는지 확인하는 방법 C# 파일 작업에서 파일이 있는지 확인하는 것은 기본적인 기능 요구 사항입니다. File.Exists 함수는 파일이 존재하는지 확인하는 데 사용되는 C#의 메서드입니다. 이 문서에서는 C#에서 File.Exists 함수를 사용하여 파일이 존재하는지 확인하는 방법을 소개하고 특정 코드 예제를 제공합니다. 네임스페이스 참조 코드 작성을 시작하기 전에 먼저 System.IO 네임스페이스를 참조해야 합니다.

jQuery에서 POST 요청 방법을 사용하는 방법 웹 개발에서는 프런트 엔드 페이지와 백엔드 서버 간의 데이터 상호 작용이 종종 포함됩니다. 그 중 POST 요청은 일반적으로 사용되는 방법입니다. POST 요청을 통해 백엔드 서버에 데이터를 제출하고 해당 반환 결과를 얻을 수 있습니다. jQuery는 AJAX 요청을 수행하는 편리한 방법을 제공하는 인기 있는 JavaScript 라이브러리입니다. 이 기사에서는 데이터 전송을 위해 jQuery에서 POST 메서드를 사용하는 방법을 소개하고 구체적인 지침을 제공합니다.

PHP 오류: 호출 가능한 솔루션으로 null을 사용하세요! PHP 개발 과정에서 흔히 발생하는 오류 중 하나는 "null을 호출 가능으로 사용하는 것"입니다. 이 오류 메시지는 호출 가능 개체를 호출할 때 null 값이 매개 변수로 전달되어 해당 작업을 수행할 수 없음을 나타냅니다. 이 오류는 일반적으로 콜백 함수, 메소드 또는 클래스 인스턴스를 호출할 때 발생하며 호출 가능한 객체를 매개변수로 올바르게 전달해야 합니다. 다음은 몇 가지 일반적인 코드 예입니다.

스레드 클래스를 생성하기 위해 Callable 인터페이스를 구현하면 Java 5부터 Callable 인터페이스가 제공됩니다. 이 인터페이스는 Runnable 인터페이스의 향상된 버전입니다. Callable 인터페이스는 스레드 실행 본문으로 call() 메서드를 제공합니다. 반환 값이 있습니다. call() 메서드 예외를 선언할 수 있습니다. booleancancel(booleanmay)은 Future와 관련된 호출 가능 작업을 취소하려고 시도합니다. Vget()은 Call 작업에서 call() 메서드의 반환 값을 반환합니다. 이 메서드를 호출하면 스레드가 차단되며 반환 값을 가져오기 전에 하위 스레드가 끝날 때까지 기다려야 합니다. Vget(장시간 초과,Ti

참고 1. Callable 인터페이스는 결과를 반환하거나 예외 작업을 발생시킬 수 있으며 구현자는 매개변수 없는 호출 메서드를 정의할 수 있습니다. 2. Thread 및 Runnable의 실행 방법과 달리 Callable 태스크의 실행 방법은 호출입니다. call()은 값을 반환할 수 있지만 run() 메서드는 그럴 수 없습니다. call()은 ClassNotFoundException과 같은 확인된 예외를 발생시킬 수 있지만 run()은 확인된 예외를 발생시킬 수 없습니다. 인스턴스 클래스MyCallableimplementsCallable{MyCallable(){}@OverridepublicInteger

코드 예제와 함께 MYSQL에서 EXISTS의 사용법 MYSQL 데이터베이스에서 EXISTS는 하위 쿼리가 최소한 한 행의 데이터를 반환하는지 여부를 결정하는 데 사용되는 매우 유용한 연산자입니다. 일반적으로 하위 쿼리 결과를 기반으로 조건을 충족하는 데이터를 필터링하기 위해 WHERE 절과 함께 사용됩니다. EXISTS를 사용할 때 다음 사항에 주의해야 합니다. EXISTS 조건은 하위 쿼리에서 반환된 특정 데이터에 관심이 없으며 반환된 데이터가 있는지 여부에만 관심이 있습니다. EXISTS 조건은 다른 조건과 조합하여 사용할 수 있습니다.
