PHP에서 닫힘...정확히 무엇을 언제 사용할 필요가 있는가?
그래서 저는 최신 객체 지향 방식으로 프로그래밍하고 있습니다.저는 정기적으로 PHP가 구현하고 있는 OOP의 다양한 측면을 활용하고 있습니다만, 언제 클로저를 사용할 필요가 있는지 궁금합니다.폐쇄를 시행하는 것이 언제 도움이 될지 밝혀줄 전문가가 있나요?
PHP는 5.3에서 기본적으로 클로저를 지원합니다.폐쇄는 작고 특정한 용도로만 사용되는 로컬 함수를 원하는 경우에 적합합니다.폐쇄에 관한 RFC는 좋은 예를 제시합니다.
function replace_spaces ($text) {
$replacement = function ($matches) {
return str_replace ($matches[1], ' ', ' ').' ';
};
return preg_replace_callback ('/( +) /', $replacement, $text);
}
하면 '보다 낫다'를 할 수 .replacement
replace_spaces()
다음과 같은 문제가 발생하지 않도록 합니다.
1) 글로벌 네임스페이스 정리
2) 3년 후에는 왜 다른 기능 내에서만 사용되는 기능이 글로벌하게 정의되어 있는지 의문을 갖게 한다.
정리된 상태를 유지합니다.에 이름이 '아까운 이름'을 하고 할당하는 에 주의해 주세요.단순히 정의되어 있습니다.$replacement
.
단, PHP 5.3을 기다려야 합니다. :)
지금 결정한 작업을 수행하는 기능이 향후 필요할 때.
를 들어 때 중 가 '1'이 있는 .hash_method
은 「 「」입니다.multiply
square
한 곳에 수 있습니다
는 (를 들어) 에할 수 .config_parser()
은 ; 라는 냅니다.do_hash_method()
config_parser()
( config " " " " ) 。★★★★★★★★★★★★★★★★★★시do_hash_method()
내의 수 .config_parser()
그 범위 내에서 불리지 않더라도요.
바람직한 가설의 예:
function config_parser()
{
// Do some code here
// $hash_method is in config_parser() local scope
$hash_method = 'multiply';
if ($hashing_enabled)
{
function do_hash_method($var)
{
// $hash_method is from the parent's local scope
if ($hash_method == 'multiply')
return $var * $var;
else
return $var ^ $var;
}
}
}
function hashme($val)
{
// do_hash_method still knows about $hash_method
// even though it's not in the local scope anymore
$val = do_hash_method($val)
}
기술적인 세부 사항과는 별도로, 폐쇄는 함수 지향 프로그래밍으로 알려진 프로그래밍 스타일의 기본적인 전제 조건입니다.폐쇄는 오브젝트 지향 프로그래밍에서 오브젝트를 사용하는 것과 같은 용도로 사용됩니다.데이터(변수)를 몇 가지 코드(함수)와 함께 바인드하여 다른 곳으로 전달할 수 있습니다.따라서 프로그램 작성 방법에 영향을 미치거나 프로그램 작성 방법을 변경하지 않으면 전혀 영향을 미치지 않습니다.
PHP는 이미 클래스 기반의 객체 지향 패러다임과 오래된 프로시저 패러다임을 중시하고 있기 때문에 PHP의 맥락에서는 조금 이상합니다.보통 폐쇄가 있는 언어에는 완전한 어휘 범위가 있습니다.이전 버전과의 호환성을 유지하기 위해 PHP는 이것을 얻지 못할 것입니다.따라서 폐쇄는 다른 언어와는 조금 다를 것입니다.아직 정확히 어떻게 사용될지는 알 수 없다고 생각합니다.
나는 troelskn의 게시물이 제공하는 맥락을 좋아한다.PHP에서 Dan Udey의 예시와 같은 것을 하고 싶을 때는 OO Strategy Pattern을 사용합니다.런타임에 동작이 결정되는 새로운 글로벌 기능을 도입하는 것보다 훨씬 낫다고 생각합니다.
http://en.wikipedia.org/wiki/Strategy_pattern
PHP에서 메서드 이름을 가진 변수를 사용하여 함수 및 메서드를 호출할 수도 있습니다. 이는 매우 좋습니다.댄의 예를 들어보면 다음과 같습니다.
class ConfigurableEncoder{
private $algorithm = 'multiply'; //default is multiply
public function encode($x){
return call_user_func(array($this,$this->algorithm),$x);
}
public function multiply($x){
return $x * 5;
}
public function add($x){
return $x + 5;
}
public function setAlgorithm($algName){
switch(strtolower($algName)){
case 'add':
$this->algorithm = 'add';
break;
case 'multiply': //fall through
default: //default is multiply
$this->algorithm = 'multiply';
break;
}
}
}
$raw = 5;
$encoder = new ConfigurableEncoder(); // set to multiply
echo "raw: $raw\n"; // 5
echo "multiply: " . $encoder->encode($raw) . "\n"; // 25
$encoder->setAlgorithm('add');
echo "add: " . $encoder->encode($raw) . "\n"; // 10
물론 모든 곳에서 사용할 수 있도록 하려면 모든 것을 정지시킬 수 있습니다.
폐쇄는 기본적으로 한 컨텍스트에서 정의를 작성하고 다른 컨텍스트에서 실행하는 함수입니다.Javascript는 어디에서나 JavaScript에 사용되고 있기 때문에 이해하는데 많은 도움이 되었습니다.
PHP에서는 함수 내에서 "글로벌"(또는 "외부") 변수의 범위와 접근성이 다르기 때문에 JavaScript보다 덜 효과적입니다.그러나 PHP 5.4부터는 폐쇄가 객체 내부에서 실행되면 $이 객체에 접근할 수 있게 되어 훨씬 더 효과적입니다.
이것이 폐쇄의 의미이며, 위에 쓰여진 내용을 이해하는 것으로 충분합니다.
이것은 함수 정의를 어딘가에 쓰고 함수 정의 내의 $this 변수를 사용하여 함수 정의를 변수에 할당하고(다른 사용자가 구문의 예를 제시), 이 변수를 객체에 전달하여 객체 컨텍스트에서 호출할 수 있어야 함을 의미합니다.그 후 함수는 t에 액세스하여 조작할 수 있습니다.그는 $이 객체의 클래스 정의에 정의되어 있지 않고 다른 곳에서 정의되어 있는 경우, 마치 다른 메서드인 것처럼 $이 객체에 대해 이의를 제기합니다.
명확하지 않더라도 안심하고 사용할 수 있습니다.
다음은 php의 닫힘 예시입니다.
// Author: HishamDalal@gamil.com
// Publish on: 2017-08-28
class users
{
private $users = null;
private $i = 5;
function __construct(){
// Get users from database
$this->users = array('a', 'b', 'c', 'd', 'e', 'f');
}
function displayUsers($callback){
for($n=0; $n<=$this->i; $n++){
echo $callback($this->users[$n], $n);
}
}
function showUsers($callback){
return $callback($this->users);
}
function getUserByID($id, $callback){
$user = isset($this->users[$id]) ? $this->users[$id] : null;
return $callback($user);
}
}
$u = new users();
$u->displayUsers(function($username, $userID){
echo "$userID -> $username<br>";
});
$u->showUsers(function($users){
foreach($users as $user){
echo strtoupper($user).' ';
}
});
$x = $u->getUserByID(2, function($user){
return "<h1>$user</h1>";
});
echo ($x);
출력:
0 -> a
1 -> b
2 -> c
3 -> d
4 -> e
5 -> f
A B C D E F
c
기본적으로 Closure는 외부 변수에 액세스할 수 있는 내부 함수이며, 이름 없는 함수(이름 없는 함수)에 대한 콜백 함수로 사용됩니다.
<?php
$param='ironman';
function sayhello(){
$param='captain';
$func=function () use ($param){
$param='spiderman';
};
$func();
echo $param;
}
sayhello();
?>
//output captain
//and if we pass variable as a reference as(&$param) then output would be spider man;
폐쇄:
MDN은 IMO에 대해 가장 잘 설명합니다.
폐쇄는 주변 상태(어휘 환경)에 대한 참조와 함께 번들된(봉쇄된) 함수의 결합이다.즉, 닫힘을 통해 내부 기능에서 외부 기능의 스코프에 액세스할 수 있습니다.
즉, 폐쇄는 상위 범위에 있는 변수에 액세스할 수 있는 함수입니다.어떤 상황에서는 함수가 한 곳에만 필요하기 때문에(콜백, 호출 가능한 인수) 폐쇄를 통해 함수를 바로 생성할 수 있습니다.
예:
$arr = [1,2,3,3];
$outersScopeNr = 2;
// The second arg in array_filter is a closure
// It would be inconvenient to have this function in global namespace
// The use keyword lets us access a variable in an outer scope
$newArr = array_filter($arr, function ($el) use ($outersScopeNr) {
return $el === 3 || $el === $outersScopeNr;
});
var_dump($newArr);
// array (size=3)
// 1 => int 2
// 2 => int 3
// 3 => int 3
언급URL : https://stackoverflow.com/questions/146737/closures-in-php-what-precisely-are-they-and-when-would-you-need-to-use-them
'programing' 카테고리의 다른 글
스크립트 언어(Perl, Python, Ruby 등)가 셸 언어로 적합하지 않은 이유는 무엇입니까? (0) | 2023.01.21 |
---|---|
마리아답:WHERE 절에서 창 함수 LAG 결과 사용 (0) | 2023.01.15 |
줄을 서야 한다." 결과 UnicodeDecodeError: 'utf-8' 코덱이 바이트를 디코딩할 수 없습니다. (0) | 2023.01.15 |
PyLint 메시지: logging-format-interpolation (0) | 2023.01.15 |
Java에서 문자열을 곱하여 시퀀스를 반복할 수 있습니까? (0) | 2023.01.15 |