[PHP] Unpacking variable other than array or Traversables must produce error
- Dominant language
- Java
- Stars
- 3.1k
- Forks
- 935
- Avg merge
- 2d 3h
- Merged PRs (30d)
- 17
Description
### Apache NetBeans version
Apache NetBeans 18
### What happened
Unpacking variable other than array or Traversables must produce error.
### How to reproduce
```php
propObject = new stdClass;
$this->propCallable = [self::class, "statFunc"];
}
}
function returnArray(): array {
return [];
}
function returnNull(): null{
return null;
}
function returnInt(): int {
return 10;
}
function returnFloat(): float{
return 20.34;
}
function returnBool(): bool {
return false;
}
function returnString(): bool {
return false;
}
function returnObject(): object {
return new MyClass;
}
function returnClosure(): closure {
return fn($a) => $a;
}
function returnCallable(): callable {
return [MyClass::class, "statFunc"];
}
function returnTraversable(): Traversable {
return new MyTraversable;
}
$myInst = new MyClass;
function testUnpacking($par1, $par2, $par3) {
echo $par1, $par2, $par3, "\n";
}
// --- array value ------------------------------------------------------------
$var1a = [1,2,3];
$var1b = [10,20,30, ...$var1a]; // OK
testUnpacking(...$var1a); // OK
$var1c = returnArray();
$var1d = [10,20,30, ...$var1c]; // OK
testUnpacking(...$var1c); // OK
$var1e = $myInst->propArray;
$var1f = [10,20,30, ...$var1e]; // OK
testUnpacking(...$var1e); // OK
// --- null value -------------------------------------------------------------
$var2a = null;
$var2b = [10,20,30, ...$var2a]; // this statement must display error
testUnpacking(...$var2a); // this statement must display error
$var2c = returnNull();
$var2d = [10,20,30, ...$var2c]; // this statement must display error
testUnpacking(...$var2c); // this statement must display error
$var2e = $myInst->propNull;
$var2f = [10,20,30, ...$var2e]; // this statement must display error
testUnpacking(...$var2e); // this statement must display error
// --- undefined variable -----------------------------------------------------
$var3b = [10,20,30, ...$var3a]; // this statement must display error
testUnpacking(...$var3a); // this statement must display error
// --- boolean value ----------------------------------------------------------
$var4a = false;
$var4b = [10,20,30, ...$var4a]; // this statement must display error
testUnpacking(...$var4a); // this statement must display error
$var4c = returnBool();
$var4d = [10,20,30, ...$var4c]; // this statement must display error
testUnpacking(...$var4c); // this statement must display error
$var4e = $myInst->propBool;
$var4f = [10,20,30, ...$var4e]; // this statement must display error
testUnpacking(...$var4e); // this statement must display error
// --- int value --------------------------------------------------------------
$var5a = 10;
$var5b = [10,20,30, ...$var5a]; // this statement must display error
testUnpacking(...$var5a); // this statement must display error
$var5c = returnInt();
$var5d = [10,20,30, ...$var5c]; // this statement must display error
testUnpacking(...$var5c); // this statement must display error
$var5e = $myInst->propInt;
$var5f = [10,20,30, ...$var5e]; // this statement must display error
testUnpacking(...$var5e); // this statement must display error
// --- float value ------------------------------------------------------------
$var6a = 20.34;
$var6b = [10,20,30, ...$var6a]; // this statement must display error
testUnpacking(...$var6a); // this statement must display error
$var6c = returnFloat();
$var6d = [10,20,30, ...$var6c]; // this statement must display error
testUnpacking(...$var6c); // this statement must display error
$var6e = $myInst->propFloat;
$var6f = [10,20,30, ...$var6e]; // this statement must display error
testUnpacking(...$var6e); // this statement must display error
// --- string value -----------------------------------------------------------
$var7a = "Hello";
$var7b = [10,20,30, ...$var7a]; // this statement must display error
testUnpacking(...$var7a); // this statement must display error
$var7c = returnString();
$var7d = [10,20,30, ...$var7c]; // this statement must display error
testUnpacking(...$var7c); // this statement must display error
$var7e = $myInst->propString;
$var7f = [10,20,30, ...$var7e]; // this statement must display error
testUnpacking(...$var7e); // this statement must display error
// --- object value -----------------------------------------------------------
$var8a = new MyClass;
$var8b = [10,20,30, ...$var8a]; // this statement must display error
testUnpacking(...$var8a); // this statement must display error
$var8c = returnObject();
$var8d = [10,20,30, ...$var8c]; // this statement must display error
testUnpacking(...$var8c); // this statement must display error
$var8e = $myInst->propObject;
$var8f = [10,20,30, ...$var8e]; // this statement must display error
testUnpacking(...$var8e); // this statement must display error
// --- closure value ----------------------------------------------------------
$var9a = fn($a) => $a*10;
$var9b = [10,20,30, ...$var9a]; // this statement must display error
testUnpacking(...$var9a); // this statement must display error
$var9c = returnClosure();
$var9d = [10,20,30, ...$var9c]; // this statement must display error
testUnpacking(...$var9c); // this statement must display error
$var9e = $myInst->propClosure;
$var9f = [10,20,30, ...$var9e]; // this statement must display error
testUnpacking(...$var9e); // this statement must display error
// --- callable value ---------------------------------------------------------
$var10a = returnCallable();
$var10b = [10,20,30, ...$var10a]; // this statement must display error
testUnpacking(...$var10a); // this statement must display error
$var10c = $myInst->propCallable;
$var10d = [10,20,30, ...$var10c]; // this statement must display error
testUnpacking(...$var10c); // this statement must display error
// --- closure value ----------------------------------------------------------
$var11a = new MyTraversable;
$var11b = [10,20,30, ...$var11a]; // OK
testUnpacking(...$var11a); // OK
$var11c = returnTraversable();
$var11d = [10,20,30, ...$var11c]; // OK
testUnpacking(...$var11c); // OK
$var11e = $myInst->propTraversable;
$var11f = [10,20,30, ...$var11e]; // OK
testUnpacking(...$var11e); // OK
// ----------------------------------------------------------------------------
function test(
array $argArray,
null $argNull,
int $argInt,
float $argFloat,
bool $argBool,
string $argString,
object $argObject,
closure $argClosure,
callable $argCallable,
Traversable $propTraversable,
) {
$var1 = [10,20,30, ...$argArray]; // OK
testUnpacking(...$argArray); // OK
$var2 = [10,20,30, ...$argNull]; // this statement must display error
testUnpacking(...$argNull); // this statement must display error
$var3 = [10,20,30, ...$argInt]; // this statement must display error
testUnpacking(...$argInt); // this statement must display error
$var4 = [10,20,30, ...$argFloat]; // this statement must display error
testUnpacking(...$argFloat); // this statement must display error
$var5 = [10,20,30, ...$argBool]; // this statement must display error
testUnpacking(...$argBool); // this statement must display error
$var6 = [10,20,30, ...$argString]; // this statement must display error
testUnpacking(...$argString); // this statement must display error
$var7 = [10,20,30, ...$argObject]; // this statement must display error
testUnpacking(...$argObject); // this statement must display error
$var8 = [10,20,30, ...$argClosure]; // this statement must display error
testUnpacking(...$argClosure); // this statement must display error
$var9 = [10,20,30, ...$argCallable]; // this statement must display error
testUnpacking(...$argCallable); // this statement must display error
$var10 = [10,20,30, ...$propTraversable]; // OK
testUnpacking(...$propTraversable); // OK
var_dump($var1, $var2, $var3, $var4, $var5, $var6, $var7, $var8, $var9, $var10);
}
```
### Did this work correctly in an earlier version?
No / Don't know
### Operating System
Windows 10
### JDK
Java: 14.0.1; Java HotSpot(TM) 64-Bit Server VM 14.0.1+7 Runtime: Java(TM) SE Runtime Environment 14.0.1+7
### Apache NetBeans packaging
Apache NetBeans binary zip
### Anything else
_No response_
### Are you willing to submit a pull request?
No
Contributor guide
Research direction
Reproduce the supplied PHP unpacking examples in Apache NetBeans 18, covering arrays, Traversable values, and the other listed types. Check that unpacking non-array, non-Traversable values reports an error while arrays and Traversable values remain valid; no source file or test path is identified in the issue.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- php
- Domain
- tooling
- Issue type
- Bug
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Stale
- Clarity
- Mostly clear
- Newbie friendliness
- 42/100