apache / apache/netbeans

[PHP] Unpacking variable other than array or Traversables must produce error

Open
#6,022 0 comments 0 reactions 0 assignees View on GitHub
kind:feature needs:triage PHP
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

Open the contributing 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

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.