peachpiecompiler / peachpie

PeachPie - the PHP compiler and runtime for .NET and .NET Core
https://www.peachpie.io
Apache License 2.0
2.33k stars 202 forks source link

property, variable and PhpValue #1115

Open N0zzy opened 1 year ago

N0zzy commented 1 year ago

image

good time of the day. i need to use the types i specify. above is a standard example in pie. however, it is permanently converted to the specified type "PhpValue". tell me how to leave the type that I specify, and not the one that is forcibly converted ??? if it's not possible, will you fix it and i can hope so???

jakubmisek commented 1 year ago

The compiler uses PhpValue instead of the exact type because in PHP it's possible to make a reference to any class property. Making a reference "changes" the type to a special PHP alias (in PeachPie it is called PhpAlias), hence we can't use MyObject type for that.

N0zzy commented 1 year ago

Thanks for the answer. I apologize for my english. Perhaps I am explaining the problem incorrectly or distorting the essence of the problem. I will try to graphically depict the problem, which, in my PERSONAL VIEW, is a semantic error.

I have created a library (C Sharp). jWphPzgiJJ4

I'm calling the native C Sharp code. The php-property is of a strict type, and the php-variable is of a dynamic type. 244928353-05194dd3-c9b5-48d0-b93b-d2052e55b10d

as a result I receive php-property - dynamic. i0I-5qka1d8

and a php-variable is strict. image

question. how to make class property - strict? I see that there is an illogical compilation result here. Let's say I'm wrong and don't understand how your compiler works.

I will explain. if a class property becomes dynamic, then such a property for passing data and using it in the c-sharp environment becomes almost impossible. Help solve this problem.

PS I quote you: " because in PHP it's possible to make a reference to any class property ".

even in the original php there is no such thing, but your sematics is not the same ...

image

jakubmisek commented 1 year ago

Please see my original answer.

In .NET we can't use the strict type, because we wouldn't be able to store PHP references in there.

class X {
  public B $b;
}
$x = new X;
$a =& $x->b; // because of this, we need to treat X.b as `PhpValue`, not `B`. We couldn't create a counted reference to X.b otherwise.
// both $x->b and $a are instance of `Pchp.Core.PhpAlias` now
$a = new B;

This is alright for local variable tho, because the compiler performs data flow analysis and it knows, the variable won't be aliased; therefore it can use the strict type.

(just an idea) We may, however, override this behavior using some additional PHPDoc annotation, so the user can "force" strict typing on a property. Making a reference to such a property would cause a runtime exception though.

N0zzy commented 1 year ago

Do you want to add something similar in the future?

/**
* @type-strict
*/
or/and
#[TypeStrict]

I think if you add this in future updates, then the responsibility for using such strict modes (as in the original php) will be the responsibility of the developer himself. I like your work, but I would like to have more flexible control over types and data when writing programs.

this example is very inconvenient to use and in some situations is simply not possible.

class X {
  public B $b;
}
$x = new X;
$a =& $x->b; // because of this, we need to treat X.b as `PhpValue`, not `B`. We couldn't create a counted reference to X.b otherwise.
// both $x->b and $a are instance of `Pchp.Core.PhpAlias` now
$a = new B;