Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

property, variable and PhpValue #1115

Open
N0zzy opened this issue Jun 10, 2023 · 4 comments
Open

property, variable and PhpValue #1115

N0zzy opened this issue Jun 10, 2023 · 4 comments

Comments

@N0zzy
Copy link

N0zzy commented Jun 10, 2023

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
Copy link
Member

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
Copy link
Author

N0zzy commented Jun 11, 2023

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
Copy link
Member

jakubmisek commented Jun 11, 2023

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
Copy link
Author

N0zzy commented Jun 11, 2023

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;

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants