original_string: public function virtualAttributesNames()
      {
          if (!empty($this->_virtualAttributes))
              return $this->_virtualAttributes;
  
          if (!is_array($this->virtualAttributes) || empty($this->virtualAttributes))
              return null;
  
          $attributes = [];
          foreach ($this->virtualAttributes as $a) {
              if (!in_array($a, $this->objAttributesNames()) && !in_array($a, $attributes)) {
                  $attributes[] = $a;
              }
          }
  
          return !empty($attributes) ? $this->_virtualAttributes = $attributes : null;
      }
code: public function virtualAttributesNames()
      {
          if (!empty($this->_virtualAttributes))
              return $this->_virtualAttributes;
  
          if (!is_array($this->virtualAttributes) || empty($this->virtualAttributes))
              return null;
  
          $attributes = [];
          foreach ($this->virtualAttributes as $a) {
              if (!in_array($a, $this->objAttributesNames()) && !in_array($a, $attributes)) {
                  $attributes[] = $a;
              }
          }
  
          return !empty($attributes) ? $this->_virtualAttributes = $attributes : null;
      }
code_tokens: public function virtualAttributesNames ( ) { if ( ! empty ( $ this -> _virtualAttributes ) ) return $ this -> _virtualAttributes ; if ( ! is_array ( $ this -> virtualAttributes ) || empty ( $ this -> virtualAttributes ) ) return null ; $ attributes = [ ] ; foreach ( $ this -> virtualAttributes as $ a ) { if ( ! in_array ( $ a , $ this -> objAttributesNames ( ) ) && ! in_array ( $ a , $ attributes ) ) { $ attributes [ ] = $ a ; } } return ! empty ( $ attributes ) ? $ this -> _virtualAttributes = $ attributes : null ; }
docstring: Verifies the configured virtual attributes
  @return mixed
docstring_tokens: Verifies the configured virtual attributes