доступ к закрытой переменной в подклассе

У меня есть класс.

<?php

class WC_Swatch_Picker {

private $size;
private $attributes;
private $selected_attributes;
private $swatch_type_options;

public function __construct( $product_id, $attributes, $selected_attributes ) {
$this->swatch_type_options = maybe_unserialize( get_post_meta( $product_id, '_swatch_type_options', true ) );

if ( !$this->swatch_type_options ) {
$this->swatch_type_options = array();
}

$product_configured_size = get_post_meta( $product_id, '_swatch_size', true );
if ( !$product_configured_size ) {
$this->size = 'swatches_image_size';
} else {
$this->size = $product_configured_size;
}

$this->attributes = $attributes;
$this->selected_attributes = $selected_attributes;
}

public function picker() {
?>

<table class="variations-table" cellspacing="0">
<tbody>
<?php
$loop = 0;
foreach ( $this->attributes as $name => $options ) : $loop++;
$st_name = sanitize_title( $name );
$hashed_name = md5( $st_name );
$lookup_name = '';
if ( isset( $this->swatch_type_options[$hashed_name] ) ) {
$lookup_name = $hashed_name;
} elseif ( isset( $this->swatch_type_options[$st_name] ) ) {
$lookup_name = $st_name;
}
?>
<tr>
<td class="label"><label for="<?php echo $st_name; ?>"><?php echo WC_Swatches_Compatibility::wc_attribute_label( $name ); ?></label></td>
<td>
<?php
if ( isset( $this->swatch_type_options[$lookup_name] ) ) {
$picker_type = $this->swatch_type_options[$lookup_name]['type'];
if ( $picker_type == 'default' ) {
$this->render_default( $st_name, $options );
} else {
$this->render_picker( $st_name, $options, $name );
}
} else {
$this->render_default( $st_name, $options );
}
?>
</td>
</tr>
<?php endforeach; ?>
</tbody>
</table>
<?php
}

Я пытаюсь расширить этот класс, чтобы я мог вывести picker() метод, который отображает <table> как <div> вместо.

Вот моя попытка расширить этот класс.

class SSi_WC_Swatch_Picker extends WC_Swatch_Picker {

public function picker() {
?>

<div class="variations-table">

<?php

$loop = 0;
foreach ( $this->attributes as $name => $options ) : $loop++;
$st_name = sanitize_title( $name );
$hashed_name = md5( $st_name );
$lookup_name = '';
if ( isset( $this->swatch_type_options[$hashed_name] ) ) {
$lookup_name = $hashed_name;
} elseif ( isset( $this->swatch_type_options[$st_name] ) ) {
$lookup_name = $st_name;
}
?>
<div>
<div class="label"><label for="<?php echo $st_name; ?>"><?php echo WC_Swatches_Compatibility::wc_attribute_label( $name ); ?></label></div>
<div>
<?php
if ( isset( $this->swatch_type_options[$lookup_name] ) ) {
$picker_type = $this->swatch_type_options[$lookup_name]['type'];
if ( $picker_type == 'default' ) {
$this->render_default( $st_name, $options );
} else {
$this->render_picker( $st_name, $options, $name );
}
} else {
$this->render_default( $st_name, $options );
}
?>
</div>
</div>
<?php endforeach;

?>

</div>

<?php
}

}

Мой вывод на экране показывает <div> как хочу но получаю
Notice: Undefined property: SSi_WC_Swatch_Picker::$attributes а также Warning: Invalid argument supplied for foreach()

Я считаю, что это потому, что родительский класс определяет $attributes как private,

К сожалению, я не могу изменить родительский класс.

Так что мои вопросы о нубе могут $attributes быть доступным из подкласса как-то? Я не вижу метод __get или __set в родительском классе, поэтому я предполагаю, что нет.

Разработчик меняет private приписывает protected, Так что это решит мою проблему доступа к свойствам.

1

Решение

Вы можете использовать отражение:

// setup a reflector for WC_Swatch_Picker::size property
$ref = new ReflectionProperty("WC_Swatch_Picker", "size");
$ref->setAccessible(true);

// read the private "size" property
$size = $ref->getValue($this);

// update the private "size" property
$ref->setValue($this, $size);

Примечание: это несколько неэффективно, поэтому, если вы собираетесь делать это много, вы должны сохранить копию экземпляра ReflectionProperty для повторного использования по мере необходимости.

1

Другие решения

Другая возможность — переопределить конструктор в вашем дочернем классе и установить собственное свойство. $attributes:

class SSi_WC_Swatch_Picker extends WC_Swatch_Picker {

private $attributes;

public function __construct( $product_id, $attributes, $selected_attributes ) {
$this->attributes = $attributes;

// Call the parent constructor.
parent::__construct( $product_id, $attributes, $selected_attributes );
}

// ...
}
1

По вопросам рекламы [email protected]