LazyPropertyTrait.php 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. <?php
  2. /**
  3. * @package Grav\Framework\Object
  4. *
  5. * @copyright Copyright (c) 2015 - 2023 Trilby Media, LLC. All rights reserved.
  6. * @license MIT License; see LICENSE file for details.
  7. */
  8. namespace Grav\Framework\Object\Property;
  9. /**
  10. * Lazy Mixed Property Trait
  11. *
  12. * Stores defined object properties as class member variables and the rest into an array. Object properties are lazy
  13. * loaded from the array.
  14. *
  15. * You may define following methods for the member variables:
  16. * - `$this->offsetLoad($offset, $value)` called first time object property gets accessed
  17. * - `$this->offsetPrepare($offset, $value)` called on every object property set
  18. * - `$this->offsetSerialize($offset, $value)` called when the raw or serialized object property value is needed
  19. *
  20. * @package Grav\Framework\Object\Property
  21. */
  22. trait LazyPropertyTrait
  23. {
  24. use ArrayPropertyTrait, ObjectPropertyTrait {
  25. ObjectPropertyTrait::__construct insteadof ArrayPropertyTrait;
  26. ArrayPropertyTrait::doHasProperty as hasArrayProperty;
  27. ArrayPropertyTrait::doGetProperty as getArrayProperty;
  28. ArrayPropertyTrait::doSetProperty as setArrayProperty;
  29. ArrayPropertyTrait::doUnsetProperty as unsetArrayProperty;
  30. ArrayPropertyTrait::getElement as getArrayElement;
  31. ArrayPropertyTrait::getElements as getArrayElements;
  32. ArrayPropertyTrait::setElements insteadof ObjectPropertyTrait;
  33. ObjectPropertyTrait::doHasProperty as hasObjectProperty;
  34. ObjectPropertyTrait::doGetProperty as getObjectProperty;
  35. ObjectPropertyTrait::doSetProperty as setObjectProperty;
  36. ObjectPropertyTrait::doUnsetProperty as unsetObjectProperty;
  37. ObjectPropertyTrait::getElement as getObjectElement;
  38. ObjectPropertyTrait::getElements as getObjectElements;
  39. }
  40. /**
  41. * @param string $property Object property name.
  42. * @return bool True if property has been defined (can be null).
  43. */
  44. protected function doHasProperty($property)
  45. {
  46. return $this->hasArrayProperty($property) || $this->hasObjectProperty($property);
  47. }
  48. /**
  49. * @param string $property Object property to be fetched.
  50. * @param mixed $default Default value if property has not been set.
  51. * @param bool $doCreate
  52. * @return mixed Property value.
  53. */
  54. protected function &doGetProperty($property, $default = null, $doCreate = false)
  55. {
  56. if ($this->hasObjectProperty($property)) {
  57. return $this->getObjectProperty($property, $default, function ($default = null) use ($property) {
  58. return $this->getArrayProperty($property, $default);
  59. });
  60. }
  61. return $this->getArrayProperty($property, $default, $doCreate);
  62. }
  63. /**
  64. * @param string $property Object property to be updated.
  65. * @param mixed $value New value.
  66. * @return void
  67. */
  68. protected function doSetProperty($property, $value)
  69. {
  70. if ($this->hasObjectProperty($property)) {
  71. $this->setObjectProperty($property, $value);
  72. } else {
  73. $this->setArrayProperty($property, $value);
  74. }
  75. }
  76. /**
  77. * @param string $property Object property to be unset.
  78. * @return void
  79. */
  80. protected function doUnsetProperty($property)
  81. {
  82. $this->hasObjectProperty($property) ? $this->unsetObjectProperty($property) : $this->unsetArrayProperty($property);
  83. }
  84. /**
  85. * @param string $property
  86. * @param mixed|null $default
  87. * @return mixed|null
  88. */
  89. protected function getElement($property, $default = null)
  90. {
  91. if ($this->isPropertyLoaded($property)) {
  92. return $this->getObjectElement($property, $default);
  93. }
  94. return $this->getArrayElement($property, $default);
  95. }
  96. /**
  97. * @return array
  98. */
  99. protected function getElements()
  100. {
  101. return $this->getObjectElements() + $this->getArrayElements();
  102. }
  103. }