рд╣рд╛рд▓рд╛рдВрдХрд┐ $GLOBAL
рдХреНрд▓реЛрдЬрд░ рдЕрдм рдХреНрд░рдордмрджреНрдз рдирд╣реАрдВ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ 01aa34783c9b19d39e568641f3f2dd0fc983b11a рдФрд░ #352 a $GLOBAL
рдПрд░реЗ рдЬрд┐рд╕рдореЗрдВ рдХреНрд▓реЛрдЬрд░ рдХреЛ рдПрдХ рдорд╛рди рдХреЗ рд░реВрдк рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдлрд┐рд░ рднреА "'рдХреНрд▓реЛрдЬрд░' рдХреЗ рд╕реАрд░рд┐рдпрд▓рд╛рдЗрдЬреЗрд╢рди рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рд╣реИ" рддреНрд░реБрдЯрд┐ рдХрд╛ рдХрд╛рд░рдг рд╣реЛрдЧрд╛ред
$GLOBALS[] = array( 'foo' => function() { return 'bar'; } );
рдореЗрд░реЗ рд╕рд╣рд┐рдд рдХреБрдЫ рд▓реЛрдЧреЛрдВ рдХреЛ рдпрд╣ рд╕рдорд╕реНрдпрд╛ рд╣реЛ рд░рд╣реА рд╣реИред http://stackoverflow.com/questions/4366592/symfony-2-doctrine-2-phpunit-3-5-serialization-of-closure-exception
рдПрдХ рдФрд░ рдорд╛рдорд▓рд╛ рдореБрдЭреЗ рдорд┐рд▓ рд░рд╣рд╛ рд╣реИ
/* рдкрд░реАрдХреНрд╖рдг.php */ рдХреНрд▓рд╛рд╕ рдХреНрд▓реЛрдЬрд░рдЯреЗрд╕реНрдЯ PHPUnit_Framework_TestCase рдХреЛ рдмрдврд╝рд╛рддрд╛ рд╣реИ { рдлрд╝рдВрдХреНрд╢рди рдЯреЗрд╕реНрдЯ рдХреНрд▓реЛрдЬрд░ () { $this->assertEquals(1, 1); call_user_func (рдлрд╝рдВрдХреНрд╢рди ($ рдП) { рдирдпрд╛ рдлреЗрдВрдХреЗрдВ \ рдЕрдкрд╡рд╛рдж ("рдкрд░реАрдХреНрд╖рдг"); }, 10); $this->assertEquals(2, 2); } }
рдФрд░ рдлрд┐рд░ рдЗрд╕реЗ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдЕрд▓рдЧрд╛рд╡ рдореЗрдВ рдЪрд▓рд╛рдПрдВ
phpunit --рдкреНрд░реЛрд╕реЗрд╕-рдЖрдЗрд╕реЛрд▓реЗрд╢рди рдЯреЗрд╕реНрдЯ.php
рдЖрдкрдХреЛ рдорд┐рд▓реЗрдЧрд╛
1 рддреНрд░реБрдЯрд┐ рдереА: 1) рдкреАрдПрдЪрдЯреЗрд╕реНрдЯ :: рдЯреЗрд╕реНрдЯ рдХреНрд▓реЛрдЬрд░ PHPUnit_Framework_Exception: PHP рдШрд╛рддрдХ рддреНрд░реБрдЯрд┐: рдзреНрдпрд╛рди рдореЗрдВ рди рдЖрдпрд╛ рдЕрдкрд╡рд╛рдж 'рдЕрдкрд╡рд╛рдж' рд╕рдВрджреЗрд╢ рдХреЗ рд╕рд╛рде 'рдмрдВрдж' рдХреЗ рдХреНрд░рдорд╛рдВрдХрди рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рд╣реИ -:37 рд╕реНрдЯреИрдХ рдЯреНрд░реЗрд╕: #0 -(37): рдХреНрд░рдордмрджреНрдз рдХрд░реЗрдВ (рдРрд░реЗ) #1 -(123): __phpunit_run_isolated_test() #2 {рдореБрдЦреНрдп} рдореЗрдВ рдлреЗрдВрдХрд╛ рдЧрдпрд╛ - рд▓рд╛рдЗрди 37 рдкрд░ рд╡рд┐рдлрд▓рддрд╛рдПрдВ! рдкрд░реАрдХреНрд╖рдг: 1, рдЕрднрд┐рдХрдерди: 0, рддреНрд░реБрдЯрд┐рдпрд╛рдБ: 1.
рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдЕрд▓рдЧрд╛рд╡ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рдореБрдЭреЗ рдПрдХ рд╣реА рд╕рдорд╕реНрдпрд╛ рдереА, рдЗрд╕рдХреЗ рдЖрд╕рдкрд╛рд╕ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореИрдВрдиреЗ рдЕрдкрдиреЗ рдЯреЗрд╕реНрдЯрдХреЗрд╕ рдореЗрдВ __ рдиреАрдВрдж рдЬреЛрдбрд╝рд╛ рдФрд░ рд╡рд╣рд╛рдВ рдмрдВрдж рд╣реЛрдиреЗ рдХреЛ рд╕рд╛рдл рдХрд░ рджрд┐рдпрд╛ред рдореЗрд░реЗ рд▓рд┐рдП рдореИрдВрдиреЗ рдЯреЗрд╕реНрдЯрдХреЗрд╕ рдХреЗ рдЧреБрдгреЛрдВ рдореЗрдВ рдХреБрдЫ рдореЙрдХ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдП рдереЗ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдореЗрд░реА рдЕрдкрдиреА рдЧрд▓рддреА рдереА, рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХрд┐рд╕реА рдХреА рдорджрдж рдХрд░реЗрдЧрд╛ред
рдореЗрд░реЗ рдкрд╛рд╕ рднреА рдпрд╣реА рд╕рдорд╕реНрдпрд╛ рд╣реИ, рдФрд░ рдкрд╣рд▓реЗ рдмрддрд╛рдП рдЧрдП @tmilos рдореБрджреНрджреЗ рдХреЛ рджреЛрд╣рд░рд╛ рд╕рдХрддреЗ рд╣реИрдВред рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдпрд╣ рдЯрд┐рдХрдЯ рдЦрддреНрдо рд╣реЛ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдЕрдЧрд░ рд╣рдо рдЗрд╕рдХрд╛ рд╕рдорд╛рдзрд╛рди рдХрд░ рд╕рдХреЗрдВред рдпрджрд┐ рдпрд╣ рдмреЗрд╣рддрд░ рд╣реИ рддреЛ рдореИрдВ рдПрдХ рдкреБрд▓ рдЕрдиреБрд░реЛрдз рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реВрдВред
рдкреБрд▓ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреА рд╣рдореЗрд╢рд╛ рд╕рд░рд╛рд╣рдирд╛ рдХреА рдЬрд╛рддреА рд╣реИ!
рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдереЛрдбрд╝рд╛ рд╕рд╛ рд╣реЛ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рдереЛрдбрд╝реА рджреЗрд░ рдХреЗ рд▓рд┐рдП рдСрдл-рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдерд╛ред @tmilos рджреНрд╡рд╛рд░рд╛ рдЯрд┐рдкреНрдкрдгреА рдХреЗ рдЖрдЧреЗ, рдореИрдВ рд╕рдорд╕реНрдпрд╛ рдХреЛ рджреЛрд╣рд░рд╛ рд╕рдХрддрд╛ рд╣реВрдВ рдпрджрд┐ рдореИрдВ рдПрдХ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рддреНрд░реБрдЯрд┐ рдХреЛ рдордЬрдмреВрд░ рдХрд░рддрд╛ рд╣реВрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:
/* test.php */
class closureTest extends PHPUnit_Framework_TestCase
{
function testClosure() {
call_user_func(function($a) {
throw new \Exception("test");
});
}
}
call_user_func
рдХреЗ рдЕрдВрдд рдореЗрдВ рджрд┐рдП рдЧрдП рддрд░реНрдХ рдХреА рдХрдореА рдкрд░ рдзреНрдпрд╛рди рджреЗрдВред рдХреНрд░рдорд╛рдВрдХрди рдЕрдкрд╡рд╛рдж PHPUnit_Framework_TestResult рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдХреНрд░рдордмрджреНрдз рдХрд░рдиреЗ рдХреЗ рдкреНрд░рдпрд╛рд╕ рд╕реЗ рдЙрддреНрдкрдиреНрди рд╣реЛрддрд╛ рд╣реИред рдпрд╣ рдХреНрд░рдорд╛рдВрдХрди рдкреНрд░рдпрд╛рд╕ PHPUnit/Framework/Process/TestCaseMethod.tpl.dist
рдХреА рд▓рд╛рдЗрди 42 рдкрд░ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЯреВ-рдмреА-рд╕реАрд░рд┐рдпрд▓рд╛рдЗрдЬреНрдб рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдЖрдкрддреНрддрд┐рдЬрдирдХ рд╣рд┐рд╕реНрд╕рд╛ рдЕрдкрд╡рд╛рдж рдХреЗ рдЯреНрд░реЗрд╕ рдкрджрд╛рдиреБрдХреНрд░рдо рдореЗрдВ рдПрдХ рдХреНрд▓реЛрдЬрд░ рд╕рдВрджрд░реНрдн рд╣реИ рдЬрд┐рд╕реЗ рдлреЗрдВрдХ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛:
[1] => Array
(
[function] => {closure}
[class] => Issue451Test
[type] => ->
[args] => Array
(
)
)
рдореЗрд░рд╛ рдкреНрд░рд╢реНрди рддрдм, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдореЗрд░рд╛ рдкрд╣рд▓реА рдмрд╛рд░ PHPUnit рдкреИрдЪрд┐рдВрдЧ рд╣реИ, рдмрдВрдж рдХрд░рдиреЗ рдпрд╛ рдЗрд╕реЗ рдЕрдиреНрдпрдерд╛ рд╕реМрдореНрдп рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдиреЗ рд╕реЗ рдХрдо рд╣реИ - рдЬрд┐рд╕рдореЗрдВ рдкреНрд░рддрд┐рдмрд┐рдВрдм рдХрд╛ рдЙрдкрдпреЛрдЧ рд╢рд╛рдорд┐рд▓ рд╣реЛрдЧрд╛ рдЗрд╕рдореЗрдВ рдХреЛрдИ рд╕рдВрджреЗрд╣ рдирд╣реАрдВ рд╣реИ - рдХреНрдпрд╛ рдЗрд╕рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ PHPUnit-рд╕рд░реНрд╡реЛрддреНрддрдо-рдЕрднреНрдпрд╛рд╕ рддрд░реАрдХрд╛ рд╣реИ ? рдХрдо рд╕реЗ рдХрдо рдХреЛрдИ рд╡рд┐рдЪрд╛рд░ рдпрд╛ рдЗрдирдкреБрдЯ?
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореИрдВрдиреЗ рд░рд┐рдЧреНрд░реЗрд╢рди/рдЧрд┐рдЯрд╣рдм рдХреЗ рддрд╣рдд рдПрдХ рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦрд╛ рдерд╛ред рдХреНрдпрд╛ рдпрд╣ рд╕реНрд╡реАрдХрд╛рд░реНрдп рд╣реИ?
@kunjalpopat , рдЖрдкрдХреА рд╕рдорд╕реНрдпрд╛ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ, рдкрд╣рд▓реА рдЪреАрдЬ рдЬреЛ рдореИрдВ
рд╕рдорд╕реНрдпрд╛ PHPUnit_Util_GlobalState::backupGlobals
:
if ($key != 'GLOBALS' &&
!in_array($key, $superGlobalArrays) &&
!in_array($key, $blacklist) &&
!$GLOBALS[$key] instanceof Closure) { // <-- this is the problem
self::$globals['GLOBALS'][$key] = serialize($GLOBALS[$key]);
}
рдореИрдВрдиреЗ PHPUnit_Util_GlobalState
рдореЗрдВ рдХреБрдЫ рд╕рд╣рд╛рдпрдХ рдмрдирд╛рдпрд╛ рд╣реИ:
public static function checkIfThereIsClosureInIt($arr) {
if ($arr instanceof Closure)
return true;
if (is_object($arr))
$arr = get_object_vars($arr);
if (is_array($arr))
foreach ($arr as $x)
if (PHPUnit_Util_GlobalState::checkIfThereIsClosureInIt($x))
return true;
return false;
}
рдФрд░ рдереЛрдбрд╝рд╛ backupGlobals
рдлрд╝рдВрдХреНрд╢рди рдмрджрд▓ рджрд┐рдпрд╛:
foreach (array_keys($GLOBALS) as $key) {
if ($key != 'GLOBALS' &&
!in_array($key, $superGlobalArrays) &&
!in_array($key, $blacklist) &&
!PHPUnit_Util_GlobalState::checkIfThereIsClosureInIt($GLOBALS[$key])
// !$GLOBALS[$key] instanceof Closure
) {
self::$globals['GLOBALS'][$key] = serialize($GLOBALS[$key]);
}
}
рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕рдВрд╕реНрдХрд░рдг рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИ (рдореИрдВ рдЕрдм рдЙрд╕ рдЕрдкрд╡рд╛рдж рдХреЛ рдирд╣реАрдВ рдкрдХрдбрд╝рддрд╛)ред
рдЪреВрдВрдХрд┐ рдпрд╣ $GLOBALS рдХреЗ рдЦрд┐рд▓рд╛рдл рдПрдХ рд░рд┐рдХрд░реНрд╕рди рд╣реИ, рдЗрд╕рд▓рд┐рдП, рдпрд╣ рд╕реАрдкреАрдпреВ рдХреЛ рдХреБрдЫ рдЕрддрд┐рд░рд┐рдХреНрдд рдЧрд░реНрдореА рджреЗ рд╕рдХрддрд╛ рд╣реИред
рд╕реНрдЯрд╛рдлрд╝ рд╕реЗ рдЙрдкрд░реЛрдХреНрдд рдХреЛрдб рдлрд┐рдХреНрд╕ рдиреЗ "рд╕реАрд░рд┐рдпрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдСрдлрд╝ рдХреНрд▓реЛрдЬрд░" рдЕрдкрд╡рд╛рджреЛрдВ рдХреЗ рд╕рд╛рде рдореЗрд░реЗ рдкрд╛рд╕ рдореМрдЬреВрдж PHPunit рдореБрджреНрджреЛрдВ рдХреЛ рдареАрдХ рдХрд┐рдпрд╛ред рдмрд╣реБрдд рдзрдиреНрдпрд╡рд╛рдж!
рдЬрдм рднреА рдореИрдВ new MyRestClient()
рддреБрд░рдВрдд рдЪрд╛рд▓реВ рдХрд░рддрд╛ рд╣реВрдВ, рддреЛ рдореЗрд░реЗ рдкрд╛рд╕ рдпрд╣реА рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рд╣реЛрддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдирд┐рд░реНрдорд╛рддрд╛ рдореЗрдВ $this->client = new \GuzzleHttp\Client();
ред рдпрд╣ рднреА рд╡рд╣реА рд╣реИ рдЬрдм рдореИрдВрдиреЗ рдЕрдкрдиреА рдХрдХреНрд╖рд╛ рдХреЗ рдирд┐рд░реНрдорд╛рддрд╛ рдореЗрдВ $x=function(){};
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛ред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ Guzzle рдХреНрд▓рд╛рдЗрдВрдЯ рдЖрдВрддрд░рд┐рдХ рд░реВрдк рд╕реЗ рдХреБрдЫ рдРрд╕рд╛ рд╣реА рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдХрднреА рднреА phpunit рдкрд░реАрдХреНрд╖рдг рдХреЗ рднреАрддрд░ рд╕реЗ рддрддреНрдХрд╛рд▓ рдХрд░рдирд╛ рдЕрд╕рдВрднрд╡ рдмрдирд╛рддрд╛ рд╣реИред рдореИрдВ рдЕрдм рдмрд╣реБрдд рджреБрдЦреА рд╣реВрдБ : рд╕реЛрдм:
рдмрд╕ рдЕрдкрдирд╛ рдЕрдиреБрднрд╡ рдЬреЛрдбрд╝ рд░рд╣рд╛ рд╣реВрдВред рдореВрд▓ рд░реВрдк рд╕реЗ рдЬрдм рднреА рдЖрдк рдЕрдирд╛рдо рдлрд╝рдВрдХреНрд╢рди рдпрд╛ рдХреНрд▓рд╛рд╕ рдХреЛ рдЯреЗрд╕реНрдЯ рдХреНрд▓рд╛рд╕ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдбрд╛рд▓рддреЗ рд╣реИрдВ, рддреЛ phpunit Serialization of 'Closure' is not allowed
рдпрд╛ Serialization of 'class<strong i="6">@anonymous</strong>' is not allowed
рдлреЗрдВрдХ рджреЗрдЧрд╛ред рдЗрд╕рд▓рд┐рдП, рдпрджрд┐ рдЖрдкрдХреЛ рдЕрдирд╛рдо рдлрд╝рдВрдХреНрд╢рди рдпрд╛ рд╡рд░реНрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдпрд╣ рдПрдХ рдмрд╛рд░ рдЪрд░ рд╣реИ, рдкрд░реАрдХреНрд╖рдг рд╡рд░реНрдЧ рд╡рд┐рд╢реЗрд╖рддрд╛ рдирд╣реАрдВред
рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА
рдЬрдм рднреА рдореИрдВ
new MyRestClient()
рддреБрд░рдВрдд рдЪрд╛рд▓реВ рдХрд░рддрд╛ рд╣реВрдВ, рддреЛ рдореЗрд░реЗ рдкрд╛рд╕ рдпрд╣реА рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рд╣реЛрддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдирд┐рд░реНрдорд╛рддрд╛ рдореЗрдВ$this->client = new \GuzzleHttp\Client();
ред рдпрд╣ рднреА рд╡рд╣реА рд╣реИ рдЬрдм рдореИрдВрдиреЗ рдЕрдкрдиреА рдХрдХреНрд╖рд╛ рдХреЗ рдирд┐рд░реНрдорд╛рддрд╛ рдореЗрдВ$x=function(){};
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛ред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ Guzzle рдХреНрд▓рд╛рдЗрдВрдЯ рдЖрдВрддрд░рд┐рдХ рд░реВрдк рд╕реЗ рдХреБрдЫ рдРрд╕рд╛ рд╣реА рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдХрднреА рднреА phpunit рдкрд░реАрдХреНрд╖рдг рдХреЗ рднреАрддрд░ рд╕реЗ рддрддреНрдХрд╛рд▓ рдХрд░рдирд╛ рдЕрд╕рдВрднрд╡ рдмрдирд╛рддрд╛ рд╣реИред рдореИрдВ рдЕрдм рдмрд╣реБрдд рджреБрдЦреА рд╣реВрдБ : рд╕реЛрдм: