Skip to content

[PropertyAccess] Fix setting public property on a class having a magic getter #14605

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

Merged
merged 1 commit into from
May 11, 2015

Conversation

lolautruche
Copy link
Contributor

Q A
Bug fix? yes
New feature? no
BC breaks? no
Deprecations? no
Tests pass? yes
Fixed tickets N/A
License MIT
Doc PR N/A

When using PropertyAccessor with an object having both a public property and a magic getter, and one wants to update this property, PropertyAccessor may lose the property reference.
This occurs when the public property value is a hash:

class Foo
{
    /**
     * Example: $this->someProperty['foo']['bar'] = 'baz'
     * @var array
     */
    public $someProperty;

    public function __get($name)
    {
        // ...
    }
}

$obj = new Foo();
$obj->someProperty = ['foo' => ['bar' => 'some_value']];

$propertyAccessor->setValue($obj, 'someProperty[foo][bar]', 'another_value');

echo $obj->someProperty['foo']['bar'];
// Before this patch: 'some_value' => fail
// After this patch: 'another_value' => correct

Furthermore, public properties are always used before __get() by PHP.

This bug is visible since v2.6.5 as d733a88 changed the way
setValue() works.

@lolautruche
Copy link
Contributor Author

Ping @Tobion

@Tobion
Copy link
Contributor

Tobion commented May 11, 2015

Please also move the public property check before the __set in writeProperty to be consistent.

…c getter

| Q             | A
| ------------- | ---
| Bug fix?      | yes
| New feature?  | no
| BC breaks?    | no
| Deprecations? | no
| Tests pass?   | yes
| Fixed tickets | N/A
| License       | MIT
| Doc PR        | N/A

When using PropertyAccessor with an object having both a public property
and a magic getter, and one wants to update this property,
PropertyAccessor may lose the property reference.
This occurs when the public property value is a hash:

```php
class Foo
{
    /**
     * Example: $this->someProperty['foo']['bar'] = 'baz'
     * @var array
     */
    public $someProperty;

    public function __get($name)
    {
        // ...
    }
}

$obj = new Foo();
$obj->someProperty = ['foo' => ['bar' => 'some_value']];

$propertyAccessor->setValue($obj, 'someProperty[foo][bar]', 'another_value');

echo $obj->someProperty['foo']['bar'];
// Before this patch: 'some_value' => fail
// After this patch: 'another_value' => correct
```

Furthermore, public properties are always used before `__get()` by PHP.

This bug is visible since v2.6.5 as d733a88 changed the way
`setValue()` works.
@lolautruche lolautruche force-pushed the propertyAccessBrokenReference branch from 393bf7c to 8b8feff Compare May 11, 2015 15:09
@lolautruche
Copy link
Contributor Author

Sure, done :)

Travis failures don't seem to be related to my patch (unrelated deprecation warnings).

@Tobion
Copy link
Contributor

Tobion commented May 11, 2015

👍

@Tobion
Copy link
Contributor

Tobion commented May 11, 2015

Thank you @lolautruche. Very good PR. I wish every PR would be that professional.

@Tobion Tobion merged commit 8b8feff into symfony:2.6 May 11, 2015
Tobion added a commit that referenced this pull request May 11, 2015
…ving a magic getter (lolautruche)

This PR was merged into the 2.6 branch.

Discussion
----------

[PropertyAccess] Fix setting public property on a class having a magic getter

| Q             | A
| ------------- | ---
| Bug fix?      | yes
| New feature?  | no
| BC breaks?    | no
| Deprecations? | no
| Tests pass?   | yes
| Fixed tickets | N/A
| License       | MIT
| Doc PR        | N/A

When using PropertyAccessor with an object having both a public property and a magic getter, and one wants to update this property, PropertyAccessor may lose the property reference.
This occurs when the public property value is a hash:

```php
class Foo
{
    /**
     * Example: $this->someProperty['foo']['bar'] = 'baz'
     * @var array
     */
    public $someProperty;

    public function __get($name)
    {
        // ...
    }
}

$obj = new Foo();
$obj->someProperty = ['foo' => ['bar' => 'some_value']];

$propertyAccessor->setValue($obj, 'someProperty[foo][bar]', 'another_value');

echo $obj->someProperty['foo']['bar'];
// Before this patch: 'some_value' => fail
// After this patch: 'another_value' => correct
```

Furthermore, public properties are always used before `__get()` by PHP.

This bug is visible since v2.6.5 as d733a88 changed the way
`setValue()` works.

Commits
-------

8b8feff [PropertyAccess] Fix setting public property on a class having a magic getter
@lolautruche
Copy link
Contributor Author

My pleasure :-)

@lolautruche lolautruche deleted the propertyAccessBrokenReference branch May 11, 2015 15:27
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

Successfully merging this pull request may close these issues.

2 participants