Open N0zzy opened 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.
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).
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.
as a result I receive php-property - dynamic.
and a php-variable is strict.
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 ...
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.
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;
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???