Since there may be need for reusability, I feel it can have this kind of
structure:

// File: A.php

```

namespace A;

typedef TypeLists {

    type Msg = string|null;

    type Numeric = int|float;

    type MyClass = \Package\Test|\Package\Db;

}

```

// file: B.php

```

declare(strict_types=1);

use A\TypeLists;

class Test1 {

    use TypeLists;

    public function greet(Msg $message): Msg {
        // ...
    }

}


$init = new Test1;

// it triggers TypeError when strict types is declared
$init->greet(1); // TypeError

```

And for local usage only:

```php

typedef T = int|string|null;

// or

type T = string|int|null;



$msg = fn (T $message): T => $message;

echo $msg;

```

On Fri, 27 Oct 2023, 12:51 am Erick de Azevedo Lima, <
ericklima.c...@gmail.com> wrote:

> I'll use it a lot if they'll be namespaced. It avoids name-collision using
> the existing ecosystem and we already use lots of "uses" in our codes.
> When Enums came to the party, they came namespaced as traits, classes and
> interfaces. The last 2 represent types, concrete and abstract.
> User defined types are nothing more than types, so I think the way to gois
> to keep it namespaced as well.
>
> About the type compatibility, covariance and contravariance, let's say I
> define some type inside my package:
>
> // File: C1.php =>  My package code
>
> namespace N1;
>
> typedef MyString =
> string|Stringable|\Symfony\Component\String\UnicodeString
> ;
> typedef MyBool = null|bool;
> typedef BigNumeric = int|float|\Brick\Math\BigNumber;
>
> class C1
> {
>     protected function myQuestionableFunction(MyString $str1): MyBool
>     {
>         //...
>     }
>
>     protected function myQuestionableFunction2(null|C1 $str1):
> ScalarNumeric
>     {
>         //...
>     }
> }
>
> // File: C2.php => On the project of those who are using my package
>
> namespace N2;
>
> typedef ScalarNumeric = int|float;
> typedef Falsy = null|false;
>
> class C1 extends C2
> {
>     protected function
>
> myQuestionableFunction(string|Stringable|\Symfony\Component\String\UnicodeString
> $str1): Falsy
>     {
>         //...
>     }
>
>     protected function myQuestionableFunction2(Falsy|C1 $str1):
> ScalarNumeric
>     {
>         //...
>     }
> }
>
> I propose that this code should be valid code, because, in the end, these
> *typedef's*, are just synonyms.
>
> *Note:* By the way, I propose to use the C/C++ keyword, which is *typedef*
> and
> dropping the syntax* "type MyType = [string, null];",*
> which differs too from how typehints are used and do not add any benefits
> *.*
>
> --
> Erick
>

Reply via email to