Skip to content

Commit 8494022

Browse files
committed
Add tests for 'from' syntax and its usage in various contexts
1 parent f48681f commit 8494022

14 files changed

Lines changed: 466 additions & 0 deletions
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
--TEST--
2+
`from` remains usable as function name (soft keyword)
3+
--FILE--
4+
<?php
5+
6+
namespace Test;
7+
8+
function from(): void
9+
{
10+
echo "ok\n";
11+
}
12+
13+
from();
14+
15+
?>
16+
--EXPECT--
17+
ok
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
--TEST--
2+
use-from: method name 'from' remains valid
3+
--FILE--
4+
<?php
5+
namespace DBTest;
6+
7+
class DB {
8+
public function from($table) {
9+
echo "from->{$table}\n";
10+
}
11+
}
12+
13+
$db = new DB();
14+
$db->from('users');
15+
16+
?>
17+
--EXPECT--
18+
from->users

Zend/tests/use_from_group.phpt

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
--TEST--
2+
Grouped 'from' syntax test
3+
--FILE--
4+
<?php
5+
6+
namespace My\Full {
7+
class ClassA { public static function id(){ return "A"; } }
8+
class ClassB { public static function id(){ return "B"; } }
9+
class ClassC { public static function id(){ return "C"; } }
10+
}
11+
12+
namespace {
13+
// Grouped form with 'from' after braces
14+
use {ClassA, ClassB, ClassC as C} from My\Full;
15+
echo ClassA::id() . "\n";
16+
echo ClassB::id() . "\n";
17+
echo C::id() . "\n";
18+
19+
// Equivalent grouped form (existing syntax) for comparison
20+
use My\Full\{ClassA as A2, ClassB as B2, ClassC as C2};
21+
echo A2::id() . "\n";
22+
echo B2::id() . "\n";
23+
echo C2::id() . "\n";
24+
25+
// Inline aliases and fully-qualified namespace
26+
use {ClassA as AA, ClassB as BB} from \My\Full;
27+
echo AA::id() . "\n";
28+
echo BB::id() . "\n";
29+
}
30+
31+
?>
32+
--EXPECT--
33+
A
34+
B
35+
C
36+
A
37+
B
38+
C
39+
A
40+
B
Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
--TEST--
2+
use ... from ... mirrors manual aliasing/importing examples
3+
--FILE--
4+
<?php
5+
6+
namespace My\Full;
7+
8+
class Classname {}
9+
class NSname {}
10+
11+
namespace My\Full\NSname\subns;
12+
13+
function func(): void
14+
{
15+
echo "NSname subns func\n";
16+
}
17+
18+
namespace some\namespace;
19+
20+
class ClassA {}
21+
class ClassB {}
22+
class ClassC {}
23+
24+
function fn_a(): void
25+
{
26+
echo "fn_a\n";
27+
}
28+
29+
function fn_b(): void
30+
{
31+
echo "fn_b\n";
32+
}
33+
34+
function fn_c(): void
35+
{
36+
echo "fn_c\n";
37+
}
38+
39+
const ConstA = "ConstA";
40+
const ConstB = "ConstB";
41+
const ConstC = "ConstC";
42+
43+
namespace Mizo\Web\Php;
44+
45+
class WebSite {}
46+
47+
namespace Mizo\Web\JS;
48+
49+
function printTotal(): void
50+
{
51+
echo "printTotal\n";
52+
}
53+
54+
const BUAIKUM = "BUAIKUM";
55+
56+
namespace foo;
57+
58+
use Classname from My\Full as Another, NSname from My\Full;
59+
use {ClassA, ClassB, ClassC as C} from some\namespace;
60+
use function {fn_a, fn_b, fn_c} from some\namespace;
61+
use const {ConstA, ConstB, ConstC} from some\namespace;
62+
use {Php\WebSite, function JS\printTotal, const JS\BUAIKUM} from Mizo\Web;
63+
64+
new Another();
65+
echo "Another OK\n";
66+
67+
NSname\subns\func();
68+
echo "NSname alias OK\n";
69+
70+
new ClassA();
71+
new ClassB();
72+
new C();
73+
echo "Group classes OK\n";
74+
75+
fn_a();
76+
fn_b();
77+
fn_c();
78+
echo "Group functions OK\n";
79+
80+
echo ConstA, " ", ConstB, " ", ConstC, "\n";
81+
echo "Group consts OK\n";
82+
83+
new WebSite();
84+
printTotal();
85+
echo BUAIKUM, "\n";
86+
echo "Mixed group OK\n";
87+
88+
?>
89+
--EXPECT--
90+
Another OK
91+
NSname subns func
92+
NSname alias OK
93+
Group classes OK
94+
fn_a
95+
fn_b
96+
fn_c
97+
Group functions OK
98+
ConstA ConstB ConstC
99+
Group consts OK
100+
printTotal
101+
BUAIKUM
102+
Mixed group OK
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
--TEST--
2+
use-from mixed-group equivalence
3+
--FILE--
4+
<?php
5+
namespace P {
6+
class A {
7+
public static function who() {
8+
echo "A\n";
9+
}
10+
}
11+
12+
namespace B {
13+
function fn() {
14+
echo "B::fn\n";
15+
}
16+
}
17+
}
18+
19+
namespace TestFrom {
20+
use {A, function B\fn} from P;
21+
A::who();
22+
fn();
23+
}
24+
25+
echo "----\n";
26+
27+
namespace TestPrefix {
28+
use P\{A, function B\fn};
29+
A::who();
30+
fn();
31+
}
32+
33+
?>
34+
--EXPECT--
35+
A
36+
B::fn
37+
----
38+
A
39+
B::fn
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
--TEST--
2+
named argument named 'from' remains usable
3+
--FILE--
4+
<?php
5+
function f($from) { echo $from; }
6+
f(from: 42);
7+
?>
8+
--EXPECT--
9+
42
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
--TEST--
2+
static method named 'from' remains usable
3+
--FILE--
4+
<?php
5+
class C {
6+
public static function from($x) { echo $x; }
7+
}
8+
C::from(123);
9+
?>
10+
--EXPECT--
11+
123

Zend/tests/use_from_syntax.phpt

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
--TEST--
2+
use SomeClass from Namespace syntax
3+
--FILE--
4+
<?php
5+
6+
namespace Test {
7+
class MyClass {
8+
public static function greet() {
9+
return "Hello from Test\\MyClass";
10+
}
11+
}
12+
}
13+
14+
namespace Foo\Bar {
15+
class Baz {
16+
public static function info() {
17+
return "Foo\\Bar\\Baz";
18+
}
19+
}
20+
}
21+
22+
namespace {
23+
use MyClass from Test;
24+
use Baz from Foo\Bar;
25+
26+
echo MyClass::greet() . "\n";
27+
echo Baz::info() . "\n";
28+
}
29+
30+
?>
31+
--EXPECT--
32+
Hello from Test\MyClass
33+
Foo\Bar\Baz
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
--TEST--
2+
use ... as/alias ordering tests
3+
--FILE--
4+
<?php
5+
6+
namespace My\Full {
7+
class Classname {
8+
public static function whoami() { return "My\\Full\\Classname"; }
9+
}
10+
}
11+
12+
namespace {
13+
// 'from' before 'as'
14+
use Classname from My\Full as Other;
15+
echo Other::whoami() . "\n";
16+
17+
// 'as' before 'from'
18+
use Classname as Other2 from My\Full;
19+
echo Other2::whoami() . "\n";
20+
21+
// Fully-qualified namespace with alias after
22+
use Classname from \My\Full as Fully;
23+
echo Fully::whoami() . "\n";
24+
25+
// Fully-qualified namespace with 'as' before 'from'
26+
use Classname as Fully2 from \My\Full;
27+
echo Fully2::whoami() . "\n";
28+
}
29+
30+
?>
31+
--EXPECT--
32+
My\Full\Classname
33+
My\Full\Classname
34+
My\Full\Classname
35+
My\Full\Classname
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
--TEST--
2+
use SomeClass from Namespace - comprehensive test
3+
--FILE--
4+
<?php
5+
6+
// Define classes in different namespaces
7+
namespace Vendor\Package\SubPackage {
8+
class MyService {
9+
public static function getName() {
10+
return "Vendor\\Package\\SubPackage\\MyService";
11+
}
12+
}
13+
}
14+
15+
namespace App\Models {
16+
class User {
17+
public static function getName() {
18+
return "App\\Models\\User";
19+
}
20+
}
21+
}
22+
23+
namespace Root {
24+
class Helper {
25+
public static function getName() {
26+
return "Root\\Helper";
27+
}
28+
}
29+
}
30+
31+
// Use the new "from" syntax
32+
namespace {
33+
// Import with qualified namespace
34+
use MyService from Vendor\Package\SubPackage;
35+
echo MyService::getName() . "\n";
36+
37+
// Import with fully-qualified namespace
38+
use User from \App\Models;
39+
echo User::getName() . "\n";
40+
41+
// Import from simple namespace
42+
use Helper from Root;
43+
echo Helper::getName() . "\n";
44+
45+
// Verify classes work (the full class names exist, not the aliases)
46+
echo class_exists('Vendor\\Package\\SubPackage\\MyService') ? "Full class name works\n" : "FAIL\n";
47+
echo class_exists('App\\Models\\User') ? "Full class name works\n" : "FAIL\n";
48+
echo class_exists('Root\\Helper') ? "Full class name works\n" : "FAIL\n";
49+
}
50+
51+
?>
52+
--EXPECT--
53+
Vendor\Package\SubPackage\MyService
54+
App\Models\User
55+
Root\Helper
56+
Full class name works
57+
Full class name works
58+
Full class name works

0 commit comments

Comments
 (0)