code: public function getDirtyAttributes($names = null)
      {
          if ($names === null) {
              $names = $this->attributes();
          }
          $names = array_flip($names);
          $attributes = [];
          if ($this->_oldAttributes === null) {
              foreach ($this->_attributes as $name => $value) {
                  if (isset($names[$name])) {
                      $attributes[$name] = $value;
                  }
              }
          } else {
              foreach ($this->_attributes as $name => $value) {
                  if (isset($names[$name]) && (!array_key_exists($name, $this->_oldAttributes) || $value !== $this->_oldAttributes[$name])) {
                      $attributes[$name] = $value;
                  }
              }
          }
  
          return $attributes;
      }
docs: Returns the attribute values that have been modified since they are loaded or saved most recently.
  
  The comparison of new and old values is made for identical values using `===`.
  
  @param string[]|null $names the names of the attributes whose values may be returned if they are
  changed recently. If null, [[attributes()]] will be used.
  @return array the changed attribute values (name-value pairs)