You don't show where you are using $user->logged, so we can't really help with that. The error is clear though, $user isn't instantiated as an instance of User where you are trying to use it.
Don't do this:
global $db; . Globalization is an absolute debugging nightmare and it compounds with the use of objects. Pass in the object (typehinted as well) to the constructor and assign it during instantiation to a member property. Unless it can be changed during a run in which case it should be passed to any method relying on it.
You shouldn't let PHP construct object properties either, otherwise you loose control of them. Same goes with why your properties should never be scoped public, especially in a datatype weak language like PHP. So where you have assignments like $this->block->$info = $value;, these should be manually assigned. Where this is used should trigger an error as block hasn't been assigned an object type (so it will trigger E_STRICT). If $info can never be pre-determined, use an array instead.