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

feat: new unique features asConstArray asImmutableArray #16

Open
2 tasks
RodrigoDornelles opened this issue Nov 21, 2023 · 3 comments
Open
2 tasks

feat: new unique features asConstArray asImmutableArray #16

RodrigoDornelles opened this issue Nov 21, 2023 · 3 comments

Comments

@RodrigoDornelles
Copy link
Owner

RodrigoDornelles commented Nov 21, 2023

  • const ability to create an array of constant size in which elements cannot be subtracted or added.
  • immutable ability to create an array so that the data is not mutable once added.
<?php

class ArrayConst implements ArrayAccess {
    private $data = [];

    public function offsetExists($offset) {
        return isset($this->data[$offset]);
    }

    public function offsetGet($offset) {
        return $this->data[$offset] ?? null;
    }

    public function offsetSet($offset, $value) {
        if ($offset === null) {
            $this->data[] = $value;
        } else if (!isset($this->data[$offset])) {
            $this->data[$offset] = $value;
        }
    }
    
    public function __debugInfo() {
    	return $this->data;
    }
    
    public function offsetUnset($offset) {
    	
    }
}

$arr = new ArrayConst();
$arr['foo'] = 'bar';
$arr['foo'] = 'bar2';
print_r($arr);
@RodrigoDornelles
Copy link
Owner Author

mayable:

$arr = ArrayLib::from(['foo', 'bar', 'z'])
   ->setExcepetions(false)
   ->setImmutable(true)
   ->setConst(true)
   ->asArray();
   
$arr[2] = 'y';
$arr[3] = 'x';
 
echo json_encode($arr); // prints: ['foo', 'bar', 'z']

@RodrigoDornelles
Copy link
Owner Author

RodrigoDornelles commented Nov 21, 2023

<?php
$var = eval(<<<CLASS
final class ArrayLibImmutableConstSafeObject extends stdClass {
	protected \$internal = ['foo' => 'bar', 'z' => 5];
	
	public function __set(\$name, \$value){}
	public function __get(\$name) {
		return \$this->internal[\$name];
	}
	
	public function __debugInfo() {
		return \$this->internal;
	}
}

return new ArrayLibImmutableConstSafeObject();
CLASS
);


$var->foo = 3;
$var->bar = 4;
$var->z = 5;

var_dump ($var);
print_r ($var);
var_dump($var instanceof stdClass);
var_dump($var->foo);
<?php $var = eval(<<<CLASS final class ArrayLibImmutableConstSafeObject extends stdClass { protected \$foo = 'bar'; protected \$z = 6; public function __set(\$name, \$value){} public function __get(\$name) { return \$this->{\$name}; } } return new ArrayLibImmutableConstSafeObject(); CLASS ); print_r ($var); var_dump($var instanceof stdClass); var_dump($var->foo); var_dump ((object) (array) $var); var_dump ((object) $var); var_dump ((array) $var);

@RodrigoDornelles
Copy link
Owner Author

$obj = ArrayLib::from(['foo' => 'bar', 'z' => 5])
   ->toFixedObject();

$obj = ArrayLib::from(['foo' => 'bar', 'z' => 5])
   ->toConstObject();

$obj = ArrayLib::from(['foo' => 'bar', 'z' => 5])
   ->toFixedConstObject();

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

1 participant